空值合并运算符??仅在左侧为null或undefined时返回右侧默认值,精准保留0、false、''等合法假值;其判断逻辑严格限于null/undefined检测,不进行真值评估,避免||因宽泛falsy判定导致的误覆盖。

空值合并运算符 ?? 的核心能力,就是精准区分 null/undefined 和其他“假值”(如 0、false、'')。它只在左侧确实是 null 或 undefined 时才启用默认值,而 0 是合法数值,不会被误判为“空”。
?? 怎么识别 0 而不触发回退
?? 的判断逻辑非常明确:仅检查是否为 null 或 undefined,不做任何类型转换或真值/假值评估。
-
0 ?? 100→ 返回0(因为0是已定义的数字) -
null ?? 100→ 返回100(null符合空值条件) -
undefined ?? 100→ 返回100(undefined同样符合) -
false ?? 'yes'→ 返回false(false不是null或undefined)
对比 || 为什么容易出错
用 || 设默认值时,JavaScript 会把所有假值(0、''、false 等)都当作“需要回退”的条件,导致业务数据丢失。
-
const count = response?.data?.count || 10;
如果 API 明确返回{data: {count: 0}},这段代码却得到10—— 逻辑错误 -
const count = response?.data?.count ?? 10;
同样返回0,真实保留了后端意图
实际场景中的典型写法
常见于 API 响应、表单字段、配置对象等需要“仅缺值才兜底”的地方:
- 用户年龄可能为
0(婴儿)、null(未填写):const age = user?.age ?? 18; - 开关状态可能是
false(关闭)、undefined(未初始化):const isActive = config?.enabled ?? true; - 链式访问 + 默认值组合:
const title = article?.meta?.title ?? article?.headline ?? '无标题';
注意优先级和嵌套安全
?? 优先级低于 && 和 ||,混用时必须加括号,否则语义会变:
- ❌ 错误:
a ?? b && c等价于(a ?? b) && c,不是“a为空则取b && c” - ✅ 正确:
a ?? (b && c)或(a ?? b) && c,按需明确分组 - 与可选链搭配时天然安全:
user?.profile?.score ?? 0即使user或profile为null也不报错,且score === 0会被原样保留
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











