逻辑短路应自然养成习惯:&&左边放大概率不成立的轻量检查,||左边放大概率成立的快速确认;须避开隐式真假误判、副作用表达式嵌入及过度嵌套三大陷阱。

逻辑短路特性不是炫技技巧,而是日常写条件时该自然养成的习惯。核心就一条:让判断尽早结束,把最可能“一票否决”或“一锤定音”的条件放左边。
&& 左边放“大概率不成立”的轻量检查
用 && 时,只要左边是 falsy(null、undefined、0、''、NaN、[] 在布尔上下文中为 false?注意:[] 是 truthy!),右边整个表达式直接跳过——这正是我们想要的。
- 防对象空指针:
user && user.profile && user.profile.avatar—— user 为 null,后面两个点操作根本不会执行 - 避数组越界:
arr && arr.length > 0 && arr[0].id—— arr 是 undefined,arr.length不会触发 TypeError - 省掉昂贵调用:
isFeatureOn() && fetchLatestData()—— 功能关了,fetch 就不发请求
|| 左边放“大概率成立”的快速确认
用 || 时,左边为 truthy 就立刻返回它,右边不执行。适合默认值、缓存命中、权限快速放行等场景。
- 设安全默认值:
config.timeout ?? 5000(推荐用空值合并);若用 ||,需注意0 || 5000会取 5000,但 0 可能是合法配置 - 缓存优先:
getCachedUser() || fetchFromApi()—— 缓存有值,API 调用完全跳过 - 角色快速兜底:
user?.role === 'admin' || hasPermission('edit')—— admin 直接过,不用再查权限表
必须避开的三个坑
短路很实用,但踩错地方反而引入 bug 或性能倒退。
-
别依赖隐式真假值做业务判断:比如
if (count && doSomething()),count 是 0 就跳过,但 0 可能是有效状态(如“剩余库存 0”) -
含副作用的表达式别塞进短路链:像
flag && console.log('hit') || sendMetric(),log 是否执行不可控,调试困难,应改用 if 块 - 别嵌套太深:超过 3~4 层 && 或 ||,V8 等引擎可能放弃优化,可读性也下降;复杂逻辑建议拆成函数,再组合调用
异步场景不能靠 &&/|| 短路
写 await apiA() && await apiB() 没用——apiA() 总是先 await 完,再判断结果。真要异步短路,得用 if:
const resA = await apiA();<br>if (resA) {<br> const resB = await apiB();<br>}

















