空值合并操作符??仅在左侧为null或undefined时返回右侧默认值,而||会将0、false、''等所有falsy值均视为无效并覆盖,因此??更精准安全。

空值赋值运算符(??)用于在左侧操作数为 null 或 undefined 时,才使用右侧的默认值——它比逻辑或 || 更精准,不会把 0、false、''(空字符串)等“falsy 值”误判为无效而覆盖。
用 ?? 替代 || 避免意外覆盖
传统用 || 设默认值容易出错:
const count = 0 || 10; // 结果是 10 ❌(但 0 是有效值)
改用 ?? 就只在真正“空”时才回退:
const count = 0 ?? 10; // 结果是 0 ✅
常见适用场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 函数参数默认值:
function log(msg) { msg = msg ?? '无内容'; } - 对象属性取值:
const name = user?.name ?? '匿名用户'; - 配置项兜底:
const timeout = config.timeout ?? 5000;
配合可选链(?.)安全读取嵌套属性
单独用 ?? 不能防止访问 null/undefined 对象的属性报错,需搭配可选链 ?. :
// 安全:user 可能为 null/undefined,name 也可能不存在 const displayName = user?.profile?.name ?? '游客'; // 危险:若 user 为 null,直接报 "Cannot read property 'name' of null" const bad = user.profile.name ?? '游客';
注意优先级和括号使用
?? 的优先级低于 =、?:,但高于 && 和 ||。混用时建议加括号明确意图:
// 模糊(按优先级实际等价于 a ?? (b && c)) a ?? b && c; // 清晰(想表达 “(a ?? b) 且 c”) (a ?? b) && c; // 常见正确写法:先 ?? 再赋值 let x; x = y ?? z; // ✅ 等价于 if (y != null) x = y; else x = z;
不支持旧浏览器,需考虑兼容性
?? 是 ES2020 特性,IE 完全不支持,旧版 Safari/Edge 也有限制。生产环境如需兼容:
- 用 Babel +
@babel/preset-env自动降级 - 或手动替换为三元表达式:
a != null ? a : b - 避免直接在 Node.js 12 以下或微信小程序基础库 2.11.0 之前使用

















