合理使用 && 和 ?? 可避免访问 undefined 属性、调用不存在方法、误用 falsy 值等错误;&& 用于安全访问嵌套属性,?? 精准设默认值(仅 null/undefined 时生效),副作用操作应显式拆分而非依赖短路。

短路运算本身不防错,但合理用好 && 和 ?? 能自然避开常见运行时错误,比如访问 undefined 属性、调用不存在的方法、误用 falsy 值当默认值等。关键不是“防止报错”这个结果,而是让逻辑更贴近真实意图。
用 && 安全访问嵌套属性
当对象层级不确定时,&& 可以在中间任一环节为 falsy 时提前退出,避免 Cannot read property 'x' of undefined。
-
常见风险写法:
user.profile.name.toUpperCase()—— 如果user或profile是null或undefined,直接报错 -
安全写法:
user && user.profile && user.profile.name && user.profile.name.toUpperCase() -
更现代的替代:用可选链
user?.profile?.name?.toUpperCase()(语义更清晰,推荐新项目优先用)
把副作用操作移出短路表达式
短路只保证“不执行”,不保证“该执行的时候一定执行”。一旦右侧有副作用(如发请求、改状态、弹提示),就容易漏掉。
-
危险示例:
isLoggedIn && fetchUserData()—— 用户未登录时,fetchUserData完全不会调用;但如果后续需求变成“无论是否登录都要预加载基础数据”,这就失效了 -
稳妥做法:显式拆开逻辑
loadBaseData();<br>if (isLoggedIn) {<br> fetchUserData();<br>} - 函数调用、
console.log、setState等都算副作用,别指望靠&&或||来“触发”它们
用 ?? 替代 || 设默认值
|| 对所有 falsy 值(0、false、'')都会兜底,常导致合法值被覆盖;?? 只在 null 或 undefined 时才生效,更精准。
-
易错写法:
const delay = config.delay || 300—— 若config.delay = 0(表示立即执行),结果却变成300,逻辑被悄悄篡改 -
正确写法:
const delay = config.delay ?? 300——0会被保留,null/undefined才用默认值 - 同理,
??=比||=更安全,适合初始化可能为0或false的变量
调试时主动验证短路是否按预期发生
开发阶段加一行日志,就能看清引擎到底有没有跳过右侧——尤其在多人协作或逻辑变复杂后。
console.log('checking token:', user?.token);<br>user?.token && console.log('→ fetching profile...') && fetchProfile();- 注意:
console.log()本身也有返回值(undefined),放在&&链里不影响逻辑,还能帮你确认执行路径 - 上线前删掉或用条件编译包裹,避免影响性能
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











