空值合并运算符??在左侧为null或undefined时返回右侧默认值,其他假值如0、false、''均保留;与||关键区别在于??不将假值视为“空”,更适用于真实空值才兜底的场景。

空值合并运算符 ?? 用于在左侧操作数为 null 或 undefined 时,返回右侧的默认值;其他任何“假值”(比如 0、false、'')都会被原样保留——这是它和逻辑或 || 最关键的区别。
什么时候该用 ?? 而不是 ||
当你只关心“是否真正缺失”,而不是“是否为假值”时,?? 更精准:
-
const count = userInput ?? 10;→ 用户输入0会被保留,不会被替换成10 -
const isActive = data.enabled ?? true;→ 即使data.enabled是false,也不会触发兜底 - 对比:
userInput || 10在userInput为0、''、false时都会取10,往往不符合预期
常见使用场景
多用于配置项、API 响应字段、函数参数默认值等需要“真实空值才兜底”的地方:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对象属性访问:
const name = user?.profile?.name ?? '匿名用户';(结合可选链,安全又简洁) - 函数参数默认值:
function greet(msg, prefix = 'Hi') { return (msg ?? prefix) + '!'; } - 从 localStorage 读取后兜底:
const theme = JSON.parse(localStorage.getItem('theme')) ?? { mode: 'light' };
注意优先级和嵌套写法
?? 的优先级低于算术和比较运算符,但高于赋值运算符;多个 ?? 连用是右结合的,通常无需括号,但混合 && 或 || 时必须加括号:
- ✅ 安全写法:
const x = a ?? b ?? c;等价于a ?? (b ?? c) - ❌ 错误写法:
a ?? b || c会先算b || c,再与a??,容易出错 - ✅ 明确意图:
(a ?? b) || c或a ?? (b || c),按需加括号
兼容性与替代方案
?? 是 ES2020 特性,现代浏览器和 Node.js 14+ 均支持。如需兼容旧环境:
- 用 Babel 编译(插件
@babel/plugin-proposal-nullish-coalescing-operator) - 手动降级:
val !== null && val !== undefined ? val : defaultValue,但更啰嗦易错 - 不推荐用
val == null ? defaultValue : val(利用null == undefined),虽简短但类型不安全,且对document.all等特殊值有副作用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










