JavaScript短路求值指&&和||根据左操作数的真值性决定是否计算右操作数:&&遇falsy即返,||遇truthy即返,返回原值而非布尔;常用于安全访问和默认值,但需注意falsy边界与副作用。

JavaScript短路求值是什么
短路求值(Short-circuit evaluation)是 JavaScript 中 && 和 || 运算符的默认行为:它们不会无条件计算两个操作数,而是根据左操作数的“真值性”(truthiness/falsiness)决定是否执行右操作数。
这意味着:&& 遇到第一个 falsy 值就停止并返回它;|| 遇到第一个 truthy 值就停止并返回它。整个表达式结果就是那个被返回的操作数值(不强制转布尔),不是 true 或 false。
为什么 && 常用来做“安全访问”而不是 if
它本质是“取第一个 falsy 值或最后一个值”,所以适合链式取值时防 undefined 报错。
-
obj && obj.user && obj.user.name不会报Cannot read property 'user' of undefined,因为前面是 falsy 就直接返回,不再继续访问 - 但注意:它不能替代完整空值检查——比如
0、''、false也是 falsy,会被提前截断,不符合“只过滤 null/undefined”的需求 - ES2020 的
?.(可选链)才是更精准的替代方案:obj?.user?.name - 不要写成
obj && obj.user && obj.user.name || 'default'——如果name是''或0,也会 fallback 到 default,这通常不是本意
为什么 || 常用来设默认值而不是 ??
|| 返回第一个 truthy 值,所以 a || b 在 a 为 falsy 时返回 b,常用于兜底。
立即学习“Java免费学习笔记(深入)”;
- 常见写法:
const timeout = config.timeout || 5000,但若config.timeout是0,也会用5000——这往往不是预期行为(0 是合法超时) - ES2020 引入的空值合并运算符
??只在左值为null或undefined时才用右值,更安全:config.timeout ?? 5000 -
||仍适用于明确想排除所有 falsy 值的场景,比如:title.trim() || 'Untitled'(空字符串或全空白时设默认)
短路求值的副作用和性能陷阱
右操作数只有在需要时才执行,所以如果它是函数调用或有副作用的表达式,可能不会运行——这点容易被忽略。
function logAndReturn(val) {
console.log('called with', val);
return val;
}
false && logAndReturn('A'); // 控制台无输出
true || logAndReturn('B'); // 控制台无输出
true && logAndReturn('C'); // 输出 "called with C"
false || logAndReturn('D'); // 输出 "called with D"
- 别依赖短路来“控制流程”,比如
condition && doSomething()看似简洁,但可读性差、调试困难,应优先用if - 在循环或高频函数中,避免把复杂计算放在短路右侧,否则逻辑隐晦且难以优化
-
&&和||优先级低于比较运算符,记得加括号:(a === b) && c(),而不是a === b && c()(虽然通常能正常工作,但易误读)
真正关键的不是“能不能用”,而是“该不该用”——falsy 的边界、副作用是否可控、团队是否熟悉这种写法,比一行省事更重要。










