&&短路防报错的核心是左侧为假值时右侧不执行,从而避免访问undefined属性;但它非类型安全,对0/false等假值会误判,此时应改用?.或显式判断。

用 && 短路特性防止属性访问报错,核心是“前面不成立,后面就不执行”。它不是类型检查,但写起来快、读起来直,适合多数运行时兜底场景。
为什么 && 能防报错?
&& 从左到右计算:只要左边是假值(null、undefined、false、0、''、NaN),整个表达式立刻返回该值,右边的属性访问根本不会发生。
-
user && user.name→ 如果user是null,直接返回null,不碰.name -
data && data.items && data.items[0] && data.items[0].id→ 中间任一环节为假,就停住,不报错 - 常见错误
Cannot read property 'xxx' of undefined就是因为跳过了这个判断
什么时候别用 &&?
当左侧可能是 0、false 或空字符串时,&& 会误判为“不存在”,导致本该取值的地方返回假值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 比如
user.age && user.age > 18,如果user.age是0,整个表达式返回0,逻辑中断 - 这时应改用可选链:
user?.age > 18,0不会中断访问 - 或者显式判断:
user != null && user.age != null && user.age > 18
怎么配合解构和默认值用?
解构本身不防错,但加 || {} 就能兜底——本质还是利用 || 的短路:左边假就取右边。
立即学习“Java免费学习笔记(深入)”;
-
const { name, email } = user || {};→user为空时用空对象,避免解构报错 -
const { count = 0 } = options || {};→ 既兜底又设默认值 - 注意:
user ?? {}更精准(只在null/undefined时替换),但||在老环境兼容性更好
它和 ?. 有什么区别?
&& 是运行时行为,靠“假值”拦截;?. 是语法级保护,只对 null 和 undefined 敏感,更语义清晰、类型友好。
-
user?.profile?.city→user是0或false都照常访问.profile -
user && user.profile && user.profile.city→user是0就直接返回0,拿不到city - TypeScript 中
&&不会缩小类型,?.则能被正确推断,推荐新项目优先用?.+??

















