空值合并操作符(??)仅在左侧为null或undefined时返回右侧值,否则返回左侧值;它区别于||操作符,后者对所有假值(如0、false、'')均生效,而??保留这些合法值,支持链式使用且常与?.配合实现安全访问。

JavaScript 中的空值合并操作符(??)专门用于处理 null 和 undefined,它不会把其他“假值”如 0、false、''(空字符串)当作空来处理。这是它和逻辑或操作符(||)最核心的区别。
空值合并操作符只对 null 和 undefined 生效
?? 的规则很明确:只要左侧操作数是 null 或 undefined,就返回右侧操作数;否则直接返回左侧操作数。其他所有值——包括 0、false、''、NaN——都会被原样保留。
-
0 ?? 42→0(不是42) -
false ?? true→false -
'' ?? 'default'→'' -
null ?? 'fallback'→'fallback' -
undefined ?? 'missing'→'missing'
与 || 操作符的关键区别
|| 是“真值判断”,只要左侧是假值(falsy),就返回右侧;而 ?? 是“空值判断”,只在 null 或 undefined 时才切换。实际开发中容易误用 || 导致意外覆盖合法的零值或空字符串。
- 用户年龄为
0(婴儿):user.age || 18会错误返回18;用user.age ?? 18才正确保留0 - 配置项允许空字符串:
config.title || 'Untitled'会让title: ''变成'Untitled';config.title ?? 'Untitled'则保持原意
可链式使用,但注意优先级
?? 支持连续使用,例如 a ?? b ?? c ?? 'default',从左到右依次检查是否为 null 或 undefined。但它不能直接和 && 或 || 混用,因为优先级低于它们,必须加括号明确意图:
- ✅ 正确:
(a ?? b) && c、a ?? (b && c) - ❌ 错误:
a ?? b && c(会被解析为(a ?? b) && c,可能不符合预期)
和可选链操作符(?.)配合很自然
在访问深层属性时,?. 遇到 null/undefined 返回 undefined,正好可以作为 ?? 的输入:
-
user.profile?.address?.city ?? 'Unknown'—— 安全取值 + 默认兜底 - 比写成
user && user.profile && user.profile.address && user.profile.address.city || 'Unknown'简洁且语义清晰
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











