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