空值合并运算符(??)仅在左侧为 null 或 undefined 时返回右侧值,否则返回左侧值;而逻辑或(||)对所有假值(如 0、''、false、NaN)均触发替换。

JavaScript 空值合并运算符(??)用于在左侧操作数为 null 或 undefined 时,返回右侧操作数;否则返回左侧操作数。它和逻辑或(||)看起来相似,但判断“假值”的范围不同——这是两者最核心的区别。
空值合并运算符只关心 null 和 undefined
?? 的判定非常精准:只有当左边是 null 或 undefined 时,才用右边的值。其他所有值,包括 0、''(空字符串)、false、NaN,都会被原样返回。
例如:
-
0 ?? 10→0(不是假值,不替换) -
'' ?? 'default'→''(空字符串不触发合并) -
null ?? 'fallback'→'fallback' -
undefined ?? 42→42
逻辑或会把所有假值都当作“无效”处理
|| 是基于布尔上下文的“真/假”判断,只要左侧是任何假值(false、0、''、null、undefined、NaN),就返回右边的值。
立即学习“Java免费学习笔记(深入)”;
例如:
-
0 || 10→10(0是假值,被替换) -
'' || 'default'→'default'(空字符串也被替换) -
false || 'yes'→'yes' -
null || 'oops'→'oops'
典型使用场景对比
当你想提供默认值,且希望保留“有意义的零值或空字符串”时,用 ?? 更安全。
- 用户年龄输入为
0是合法的 →user.age ?? 18保留0;而user.age || 18会误判成未填,变成18 - 配置项允许空字符串表示“不启用某功能” →
config.title ?? 'Untitled'不会覆盖空字符串;config.title || 'Untitled'会错误地替换成默认标题 - 从 API 获取数据,字段可能缺失 →
data?.price ?? 0明确处理缺失(null/undefined),不干扰真实为0的价格
注意链式与优先级
?? 的优先级低于 =、?:,但高于 && 和 ||。不能直接和 || 混用,否则会报错:
-
val ?? 10 || 20→ 语法错误(需加括号:(val ?? 10) || 20) -
val ?? (10 || 20)→ 合法,先算10 || 20得10,再执行val ?? 10 - 常配合可选链
?.使用:obj?.prop ?? 'default'
基本上就这些。选 ?? 还是 ||,关键看你想过滤“所有假值”,还是只兜底“真正缺失的值”。











