在 JavaScript 中,||(逻辑或)和 &&(逻辑与)操作符不总是返回布尔值,而是返回参与运算的其中一个操作数的原始值。
1. 逻辑或 || (Logical OR)
规则:返回第一个 truthy 值;如果所有值都是 falsy,则返回最后一个值。
// 短路求值:找到第一个 truthy 值就立即返回
"hello" || "world" // "hello"(第一个值就是 truthy)
0 || "default" // "default"(0 是 falsy,返回第二个)
null || undefined || 42 // 42(前两个都是 falsy,返回最后一个)
"" || false || "ok" // "ok"
// 所有值都是 falsy
0 || "" || null // null(返回最后一个)
false || undefined // undefined
常用场景:提供默认值
const name = userInput || "默认名称";
const count = config.count || 10;
2. 逻辑与 && (Logical AND)
规则:返回第一个 falsy 值;如果所有值都是 truthy,则返回最后一个值。
// 短路求值:找到第一个 falsy 值就立即返回
true && false // false
"hello" && "world" // "world"(两个都是 truthy,返回最后一个)
0 && "anything" // 0(第一个就是 falsy,立即返回)
null && undefined // null
// 所有值都是 truthy
true && "hello" && 42 // 42(返回最后一个)
"a" && "b" && "c" // "c"
常用场景:条件执行
isLoggedIn && showDashboard();
user && user.name && user.name.toUpperCase();
3. 短路求值机制
- ||:如果第一个操作数是 truthy,不再计算第二个操作数
- &&:如果第一个操作数是 falsy,不再计算第二个操作数
false && console.log("不会执行") // 不会输出
true || console.log("不会执行") // 不会输出
4. 与三元运算符对比
// || 相当于
value1 || value2
// 等价于
value1 ? value1 : value2
// && 相当于
value1 && value2
// 等价于
value1 ? value2 : value1
5. 注意事项
- 返回值是原始值,不是布尔值
- 利用短路特性可以优化性能或避免错误
- ES2020 引入了空值合并运算符 ??,只检查 null 和 undefined,不检查其他 falsy 值:0 || 10 // 10
0 ?? 10 // 0(0 不是 null/undefined)"" || "def" // "def"
"" ?? "def" // ""(空字符串不是 null/undefined)
6. 实际示例
// 链式调用保护
user && user.profile && user.profile.avatar;
// 默认值设置
const config = {
timeout: 0,
retries: undefined
};
const finalTimeout = config.timeout || 3000; // 3000(0 是 falsy)
const finalRetries = config.retries ?? 3; // 3(undefined 是 null/undefined)
总结:
- || 返回第一个 truthy 值,或最后一个 falsy 值
- && 返回第一个 falsy 值,或最后一个 truthy 值
- 两者都使用短路求值,返回的是操作数的原始值






