JavaScript短路求值指&&和||根据左操作数的真值性决定是否计算右操作数:&&遇falsy即返,||遇truthy即返,返回原值而非布尔;常用于安全访问和默认值,但需注意falsy边界与副作用。
短路求值(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”的需求?. (可选链)才是更精准的替代方案:obj?.user?.name
obj && obj.user && obj.user.name || 'default'——如果 name 是 ''
或 0,也会 fallback 到 default,这通常不是本意|| 常用来设默认值而不是 ??
|| 返回第一个 truthy 值,所以 a || b 在 a 为 falsy 时返回 b,常用于兜底。
const timeout = config.timeout || 5000,但若 config.timeout 是 0,也会用 5000——这往往不是预期行为(0 是合法超时)?? 只在左值为 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 的边界、副作用是否可控、团队是否熟悉这种写法,比一行省事更重要。