空值合并运算符(??)仅在左侧为null或undefined时返回右侧操作数,否则返回左侧;它不将0、''、false、NaN等假值视为缺失,而逻辑或(||)会替换所有假值。

JavaScript空值合并运算符(??)用于在左侧操作数为 null 或 undefined 时,返回右侧操作数;否则返回左侧操作数。它和逻辑或(||)看起来功能相似,但关键区别在于“判定为假值”的范围不同。
空值合并运算符只对 null 和 undefined 生效
它不会把其他假值(如 0、''(空字符串)、false、NaN)当作“缺失值”来处理:
-
0 ?? 10→ 0(因为 0 是有效值,不为 null/undefined) -
'' ?? 'default'→ ''(空字符串被保留) -
null ?? 'fallback'→ 'fallback' -
undefined ?? 'missing'→ 'missing'
逻辑或会把所有假值都当作“可替换项”
|| 基于“真值/假值”判断,只要左侧是假值(falsy),就取右侧:
-
0 || 10→ 10(0 是假值,被替换) -
'' || 'default'→ 'default'(空字符串被替换) -
false || 'yes'→ 'yes' -
null || 'n/a'→ 'n/a'
典型使用场景对比
假设你从 API 获取用户年龄,可能返回 0(合法年龄)或 null(数据未提供):
立即学习“Java免费学习笔记(深入)”;
- 用
??:user.age ?? 18→ 正确保留 0,仅在无数据时回退 - 用
||:user.age || 18→ 把 0 当作无效,错误回退为 18
再比如配置对象中允许空字符串作为有效值:config.title ?? 'Untitled' 不会覆盖空标题,而 config.title || 'Untitled' 会。
优先级与结合性注意点
?? 的优先级低于 || 和 &&,所以不能直接混用,必须加括号明确意图:
-
a ?? b || c等价于(a ?? b) || c,不是a ?? (b || c) - 想表达“a为空则取b,否则若b为假再取c”,应写成:
a ?? (b || c)
另外,?? 不能与 && 或 || 直接相邻(如 a && b ?? c 会报错),必须用括号包裹任一操作数。










