短路运算符需合理布局:&&左侧放轻量判断、右侧放耗时操作,用于前置校验;||左侧放主逻辑、右侧放默认值或备选路径,注意falsy值陷阱;避免在异步、副作用或复杂场景滥用。

把轻量、高确定性的判断放左边,把耗时操作放右边,短路特性才能真正跳过执行。
&& 用在“必须满足前置条件”时
左侧条件为假就停止,右侧不会运行。适合做安全访问或前置校验。
- 对象属性安全访问:
obj && obj.user && obj.user.name,任意一层为 null/undefined 就终止,避免报错 - 函数调用守卫:
isValid() && fetchData(),只有验证通过才发起请求 - 注意别把耗时函数放左边——
getBigData() && checkResult()每次都会执行getBigData(),失去短路意义
|| 用在“有默认值或备用路径”时
左侧为真就直接返回,右侧不执行。常用于兜底、降级或初始化。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 设置默认值:
const name = user?.name || 'anonymous',name 为空字符串、null、undefined 时启用默认 - 提供备选逻辑:
getCachedData() || fetchRemoteData(),缓存命中则不走网络 - 避免误判:0 或 '' 是 falsy,若需保留这些值,改用空值合并操作符
??,比如count ?? 0
警惕隐式转换带来的意外行为
短路基于真值/假值判断,不是严格布尔值。数组、对象永远为真,0 和空字符串为假——这容易引发逻辑偏差。
立即学习“Java免费学习笔记(深入)”;
- 错误写法:
arr.length && arr[0].id—— 若arr = [null],length 是 1(truthy),但取id会报错 - 更稳妥写法:
Array.isArray(arr) && arr.length > 0 && arr[0]?.id,先类型检查,再长度判断,最后可选链 - 避免依赖副作用,如
flag && doSideEffect()不如明写if (flag) doSideEffect(),可读性和调试更友好
异步场景下短路不生效
await 表达式不能被 && 或 || 短路——await a() && await b() 中,a() 总是先执行完才判断是否执行 b()。
- 想实现异步条件执行,必须用显式
if:if (await hasPermission()) await doAction() - 短路只跳过“执行”,不跳过“构造”。例如
cond && (() => heavy())(),箭头函数本身仍会被创建,频繁使用可能带来内存压力 - 复杂或高频逻辑,建议封装成独立函数,按需调用,而不是塞进一行短路表达式

















