空值合并操作符(??)仅在左侧为null或undefined时返回右侧值,对0、false、''、NaN等falsy值仍返回原值;与||不同,??基于空值性而非真值性判断,支持链式使用且需注意运算符优先级。

JavaScript中的空值合并操作符(??)专门用于处理 null 和 undefined,它只在这两个值上返回右侧操作数,其他任何值(包括 0、false、''、NaN)都会被原样返回。
只对 null 和 undefined 生效
?? 的核心逻辑是:当左侧操作数为 null 或 undefined 时,才使用右侧的默认值;其余所有“falsy”值均不触发替换。
-
null ?? 'default'→'default' -
undefined ?? 'default'→'default' -
0 ?? 'default'→0(不会变成'default') -
false ?? 'default'→false -
'' ?? 'default'→'' -
NaN ?? 'default'→NaN
与逻辑或(||)的关键区别
|| 是基于“真值性”(truthy/falsy)判断的,只要左侧为 falsy 值就用右边;而 ?? 是基于“空值性”(nullish),仅对 null 和 undefined 敏感。
- 想提供默认值且允许
0、false等合法业务值存在 → 用?? - 想在任意 falsy 情况下兜底(比如表单未填即用默认)→ 可考虑
||,但需谨慎 - 常见误用:
user.age || 18在age = 0时会错误返回18;应改用user.age ?? 18
支持链式与嵌套使用
?? 是右结合的,可自然链式写多个备选值,也常配合可选链(?.)安全读取深层属性。
立即学习“Java免费学习笔记(深入)”;
-
a ?? b ?? c等价于a ?? (b ?? c),取第一个非 null/undefined 的值 -
obj?.prop?.sub ?? 'fallback':先安全访问,再空值合并,避免 TypeError - 注意:不能直接混合
??和&&/||使用(如a ?? b && c),需加括号明确优先级
兼容性与替代写法
?? 是 ES2020 特性,现代浏览器和 Node.js 14+ 均已支持。若需兼容旧环境,可用逻辑表达式模拟:
- 替代写法:
(val === null || val === undefined) ? defaultValue : val - 也可封装工具函数:
const nullish = (v, d) => v == null ? d : v;(利用== null同时匹配null和undefined) - 注意:Babel 转译时需启用
@babel/plugin-proposal-nullish-coalescing-operator


















