??仅在左侧为null或undefined时返回右侧默认值,保留0、false、''等falsy值;||则对所有falsy值(含0、''、false等)均触发默认值,适用场景不同。

空值合并运算符 ?? 专门用来处理 null 和 undefined 的默认值场景,它只在左侧值严格等于 null 或 undefined 时才返回右侧的默认值,不会被 0、false、''(空字符串)等“falsy”值触发。
?? 和 || 的关键区别
很多人误用 || 设默认值,但它会把所有 falsy 值都当成“无效”,而 ?? 更精准:
-
0 || 10→10(因为0是 falsy) -
0 ?? 10→0(因为0不是null或undefined) -
undefined ?? 10→10 -
null ?? 'fallback'→'fallback'
常见默认值使用场景
适合用于配置项、API 返回数据、表单输入等可能缺失但允许为 0/空字符串的场景:
- 用户年龄字段:如果后端没传
age(即undefined),才设默认值18;但如果传了0(婴儿),应保留:user.age ?? 18 - 分页参数:
params.limit ?? 20,避免limit: 0被错误替换成20 - 可选配置对象:
config.theme ?? 'light',只有config.theme确实未定义时才生效
注意链式与优先级
?? 的优先级低于 . 和 [],但高于 = 和 ?:,且不能直接跟在 && 或 || 后面(会报语法错误),需加括号:
立即学习“Java免费学习笔记(深入)”;
- ✅ 正确:
(a && b) ?? c或a?.b ?? 'default' - ❌ 错误:
a && b ?? c(语法错误) - ✅ 安全写法:
obj?.settings?.timeout ?? 5000(结合可选链,清晰表达“深层属性不存在才设默认”)
不适用的情况
如果业务逻辑确实要把 0、false、'' 当作“无效”来处理,默认值就该用 || 或显式判断:
- 开关状态:
isPublished || true(希望false也走默认) - 搜索关键词:
query || 'all'(空字符串也视为未输入) - 此时用
??反而会破坏逻辑


















