空值合并运算符(??)仅在左侧为null或undefined时使用右侧默认值,不处理0、false、''等假值;适用于空值兜底场景,不可替代涉及真假判断、多分支或函数调用的三元表达式。

空值合并运算符(??)不能直接替代所有三元表达式,但它能简洁处理“仅当左侧为 null 或 undefined 时才使用右侧默认值”的场景——这正是它和三元表达式的关键区别。
适用场景:只关心 null/undefined,默认值兜底
当你原本写的是:const name = user.name !== null && user.name !== undefined ? user.name : '匿名';
或更常见的简写:const name = user.name ? user.name : '匿名';(⚠️注意:这个三元会把 ''、0、false 也当成假值)
而你真正想表达的是:“只要 user.name 是 null 或 undefined,就用默认值”,那就该用 ??:
const name = user.name ?? '匿名';- 它不会把
0、false、''当作“空”而替换,只认null和undefined - 语义清晰,代码更短,可读性更高
不适用场景:需要判断真假值或执行逻辑分支
如果三元表达式里涉及布尔判断、函数调用、条件计算等,?? 就无能为力了。例如:
-
const status = isLoading ? '加载中' : data ? '成功' : '暂无数据';→ 含多分支,??无法替代 -
const msg = count > 0 ? `共${count}条` : '暂无记录';→ 涉及比较运算,必须用三元 -
const result = value ? process(value) : fallback();→ 右侧是函数调用,??只做值选择,不改变执行逻辑
可组合使用:?? 配合 || 或逻辑运算符更灵活
有时你需要“先处理空值,再处理假值”,可以组合使用:
立即学习“Java免费学习笔记(深入)”;
-
const title = article.title ?? article.headline ?? '未命名';(链式提供多个备选) -
const displayText = (user.nickname ?? user.name ?? '').trim() || '用户';(先用 ?? 处理空值,再用 || 处理空字符串) - 注意顺序:
??优先级低于&&/||,必要时加括号,如:(a ?? b) || c
迁移建议:检查原始三元是否真在处理“空值”
把旧三元改成 ?? 前,务必确认原意:
- 原三元是否把
0、false、''当成“无效”?如果是,改用??可能引入 bug - 原变量是否可能为
undefined或null?如果不是,??没意义 - 不确定时,加个测试用例验证:
console.log(0 ?? 'default'); // 输出 0


















