空值合并运算符(??)仅在操作数为null或undefined时提供默认值,不能防止空指针异常;需配合可选链(?.)使用,如user?.name ?? 'anon'安全,而user.name ?? 'anon'会报错。

JavaScript 中的空值合并运算符(??)**不能直接防止空指针异常(如 TypeError: Cannot read property 'x' of null)**,它只在左侧操作数为 null 或 undefined 时提供默认值,但**不会阻止对 null 或 undefined 调用属性或方法**。要真正避免空指针异常,需配合可选链操作符(
?.)使用。 <h3>空值合并运算符 ?? 的作用范围</h3> <p><code>??</code></p>只做“兜底赋值”,不解决属性访问阶段的报错:
- ✅ 正确用法:安全地给可能为空的变量设默认值
const name = user?.name ?? 'Anonymous';
这里user?.name先用可选链避免报错,再用??处理undefined情况。 - ❌ 错误假设:
const city = user.address.city ?? 'Beijing';
如果user是null或undefined,这行代码会立即抛出TypeError,??根本没机会执行。
必须搭配可选链操作符 ?.
处理嵌套对象访问时,?. 负责“静默失败”,?? 负责“兜底取值”:
-
const zip = user?.address?.zipcode ?? '000000';
即使user、address任一为null/undefined,也不会报错,最终返回默认值。 -
const items = data?.items?.filter(x => x.active) ?? [];
安全调用方法 + 默认空数组,避免data.items.filter is not a function类错误。
注意与逻辑或 || 的区别
?? 只在 null 或 undefined 时生效;|| 会对所有 falsy 值(如 0、''、false)触发默认值,容易引发意外:
-
const count = obj?.count ?? 10;
若obj.count === 0,结果是0(符合预期)。 -
const count = obj?.count || 10;
若obj.count === 0,结果却是10(逻辑错误)。
常见空指针场景及写法对比
假设 user = null:
- ❌ 报错:
user.name - ❌ 报错:
user?.name ?? 'Anon'→user?.name得到undefined,??生效,结果是'Anon'✅
(注意:这里不报错,因为?.已拦截) - ❌ 报错:
user.name ?? 'Anon'→user为null,访问.name立即抛异常 - ✅ 安全:
user?.profile?.avatar?.url ?? '/default.png'
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











