??是es2020引入的空值合并运算符,仅当左侧为null或undefined时返回右侧默认值;而||是假值合并,会错误覆盖0、''、false等合法值。

ES6 中没有空值合并运算符,它是 ES2020(即 ECMAScript 2020)引入的 ?? 运算符。它专门用于在左侧操作数为 null 或 undefined 时,返回右侧的默认值,比逻辑或 || 更精准、更安全。
为什么不用 ||?
|| 是“假值(falsy)合并”,会把 0、''(空字符串)、false 等合法值也当成“需要替换”,导致意外覆盖:
-
const count = 0 || 10;→ 得到10(但0是有效计数) -
const name = '' || '匿名用户';→ 得到'匿名用户'(但空名可能是有意留空) -
??只在null或undefined时生效,其余值原样保留
?? 的基本用法
语法简洁:左侧 ?? 右侧。左侧为 null 或 undefined 就取右侧,否则取左侧:
const x = null ?? 'default'; // 'default'const y = undefined ?? 'fallback'; // 'fallback'const z = 0 ?? 42; // 0(不触发默认)const msg = '' ?? 'no message'; // ''(空字符串不触发)
链式与嵌套场景处理
可配合可选链(?.)安全访问深层属性,并优雅设默认值:
const city = user?.address?.city ?? '未知城市';const items = data?.list?.length ?? 0;- 注意:
??优先级低于=和?:,但高于&&/||;混用时建议加括号避免歧义 - 例如:
(a ?? b) || c明确表示“先空值合并,再逻辑或”
常见误用提醒
别把它当万能兜底,需理解它的语义边界:
-
??不处理NaN、0、false、''—— 它们不是空值,是有效值 - 如果业务中
0表示“未设置”,那说明数据建模有问题,应统一用null表示缺失 - 函数参数默认值仍推荐用解构默认值(
function fn({ x = 5 } = {}) {...}),??更适合运行时动态判断
不复杂但容易忽略:它只认 null 和 undefined,不多不少,正是这种克制让它成为设置默认值最可靠的工具之一。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











