逻辑短路(&& 或 ||)的核心价值在于避免不必要的计算和潜在错误,如访问 null/undefined 属性导致报错;&& 用作存在性守卫可安全读取嵌套属性,|| 提供默认值但需警惕假值陷阱,?? 更适合空值 fallback;耗时操作应置于短路右侧以实现惰性求值;复杂条件应拆解为清晰变量或函数以提升可读性与可维护性。

属性检查时用逻辑短路(&& 或 ||)不只是为了少写几行代码,关键是避免不必要的计算和潜在错误——比如访问 null 或 undefined 的属性会直接报错,而短路能天然跳过这些危险操作。
优先用 && 做存在性守卫
当你要安全读取嵌套属性(如 user.profile.avatar.url),别急着加一堆 if 判断。用 && 链式判断,左边为假就立刻停止,右边根本不会执行:
const url = user && user.profile && user.profile.avatar && user.profile.avatar.url;- 更现代的写法是可选链(
?.),但&&兼容性更好,且在条件复杂时更可控(比如要结合类型判断) - 注意:
&&返回的是最后一个被求值的值,不是布尔值。所以它既能做守卫,又能取值
用 || 提供默认值,但小心“假值”陷阱
a || b 常用于 fallback,但 0、''、false 都会被当成“假”,导致本意是保留 0 却被替换成默认值:
- 想真正检测是否为
undefined或null,改用空值合并操作符:a ?? b - 如果必须用
||,确保你清楚哪些“假值”是业务上允许的,哪些需要保留 - 例如:
config.timeout || 5000在 timeout=0 时会误用默认值;应改为config.timeout ?? 5000
把耗时或副作用操作放在短路右侧
逻辑短路的本质是“惰性求值”。把开销大的函数(如 API 调用、正则匹配、深克隆)放在 && 右边,确保只在必要时才执行:
-
isValid && validateForm() && submitForm()—— 只有前两项都为真,才会调用submitForm() - 避免写成
validateForm() && submitForm()而不提前校验状态,否则每次都会执行validateForm() - 副作用函数(如日志、埋点)也适合放在这里,做到按需触发
别让短路掩盖真实意图
短路很简洁,但过度嵌套或混用会让逻辑难读。遇到复杂条件,不如拆成变量或封装函数:
- 坏例子:
user && user.role === 'admin' && permissions.includes('delete') && !isLocked && doDelete() - 好做法:先提取判断逻辑,如
const canDelete = isUserAdmin(user) && hasPermission('delete') && !isLocked;,再canDelete && doDelete(); - 可读性和可测试性比一行省事更重要;短路是工具,不是目的
不复杂但容易忽略:短路不是语法糖,它是运行时控制流的一部分——用对了,代码既安全又高效;用错了,可能藏 bug,还拖慢性能。



















