空值合并运算符(??)在左侧为null或undefined时返回右侧值,否则返回左侧值;它比||更精准,不误判0、false、''等假值,适用于需保留合法假值的默认值场景。

空值合并运算符(??)用于在左侧操作数为 null 或 undefined 时,返回右侧操作数;否则返回左侧操作数。它比逻辑或(||)更精准,只对真正“空值”起作用,不会误判 0、false、'' 等假值。
什么时候该用 ?? 而不是 ||
当你要处理可能为 null 或 undefined 的默认值,又希望保留像 0、false、空字符串这类合法但为假的值时,?? 是更安全的选择。
-
const count = userInput ?? 10;→ 如果userInput是null或undefined,才用10;如果是0或false,就原样保留 -
const name = data.name || 'Anonymous';→ 若data.name是''或0,也会触发默认值,这往往不是本意 -
const name = data.name ?? 'Anonymous';→ 只有name确实没定义或显式为null才用默认名
常见使用场景
空值合并常用于配置项、API 响应解析、表单输入等存在“未设置”语义的场合。
- 解构赋值时设默认值:
const { timeout = 5000, retries } = config;中retries没默认值,可用retries ?? 3 - 链式访问防报错:
user.profile?.avatar ?? '/default-avatar.png',既用可选链又兜底 - 函数参数默认处理:
function log(msg, level) { level = level ?? 'info'; console.log(`[${level}] ${msg}`); }
注意优先级和结合性
?? 的优先级低于算术和比较运算符,但高于 = 和 ?:,且是右结合。混用时建议加括号避免歧义。
立即学习“Java免费学习笔记(深入)”;
- ✅ 推荐写法:
const value = (a ?? b) + c; - ⚠️ 避免歧义:
a ?? b + c实际等价于a ?? (b + c),不是(a ?? b) + c - ❌ 不能与
&&或||直接混用:a ?? b && c会报语法错误,必须写成(a ?? b) && c
兼容性与替代方案
?? 是 ES2020 特性,现代浏览器和 Node.js 14+ 原生支持。若需兼容旧环境,可用 Babel 编译,或手动降级:
- 替代写法:
left !== null && left !== undefined ? left : right - 或封装工具函数:
const coalesce = (val, fallback) => val == null ? fallback : val;(注意== null等价于=== null || === undefined)



















