空值合并操作符(??)仅在左侧为null或undefined时使用右侧值,而||对所有假值(0、false、''、null、undefined、NaN)均生效;??与?.配合可安全处理嵌套对象的空值。

空值合并操作符(??)只在左侧值为 null 或 undefined 时,才使用右侧的默认值;其他“假值”(比如 0、false、'')都会被原样保留。
它和逻辑或(||)的区别在哪
|| 是“真值判断”,遇到任何假值(0、false、''、null、undefined、NaN)就用右边值;?? 是“空值判断”,只对 null 和 undefined 敏感。
-
0 ?? 10→0(0不是空值,不替换) -
0 || 10→10(0是假值,被替换) -
'' ?? 'default'→''(空字符串有效,保留) -
null ?? 'default'→'default' -
undefined ?? 'default'→'default'
常见使用场景
适合明确区分“未设置”和“已设置但为零/空”的情况。
- 配置项:用户没传
timeout(undefined),才用默认值;但传了0表示“不超时”,不能覆盖 - 接口返回字段:后端可能返回
null表示缺失,但0是合法数值(如库存为 0) - 解构赋值时设默认值:
const { count = 0 } = obj是解构默认值,而obj.count ?? 0是运行时安全取值
链式与优先级注意点
?? 的优先级低于 ?.(可选链),但高于 = 和 ,,且**不能直接跟在 && 或 || 后面**,否则会报错。
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
obj?.prop ?? 'default' - ✅ 正确:
(a ?? b) || c(加括号明确顺序) - ❌ 错误:
a ?? b || c(语法错误,必须加括号) - ⚠️ 注意:
??从左到右结合,a ?? b ?? c等价于(a ?? b) ?? c
和可选链(?.)配合最实用
处理深层嵌套对象中可能为空的字段,既避免报错,又不误判有效假值。
-
user?.profile?.age ?? 18:如果user或profile为null/undefined,整个表达式为undefined,触发??;如果age是0,就用0 - 比
user && user.profile && user.profile.age || 18更简洁、语义更准


















