空值合并运算符(??)仅在左侧为null或undefined时返回右侧值,对false、0、''、NaN等假值仍返回原值;常用于默认配置、安全取值及与可选链?.配合使用。

空值合并运算符(??)用于在左侧操作数为 null 或 undefined 时,返回右侧操作数;其他任何值(包括 false、0、''、NaN)都会原样返回,不会触发默认值。
基本用法:只对 null 和 undefined 生效
它和逻辑或(||)不同:后者会在左侧为“假值”(falsy)时回退,而 ?? 更精准,只关心是否真正“缺失”。
const name = null ?? '匿名用户'; // '匿名用户'const count = 0 ?? 10; // 0(0 是有效值,不触发默认)const flag = false ?? true; // false(false 不是 null/undefined)const data = undefined ?? { id: 1 }; // { id: 1 }
常用于设置默认配置或安全取值
尤其适合处理可能未定义的 API 响应字段、函数参数或对象属性。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 函数参数默认值:
function greet(user) { const name = user?.name ?? '访客'; console.log(`你好,${name}`); } - 链式可选链配合:
const city = user?.address?.city ?? '未知城市';(?.防止报错,??提供兜底) - 配置合并:
const timeout = config.timeout ?? 5000;(即使 config.timeout 显式设为 0,也不会被覆盖)
注意优先级和结合性
?? 的优先级低于算术、比较运算符,但高于 = 和 ?:,且是右结合。使用时建议加括号避免歧义。
立即学习“Java免费学习笔记(深入)”;
- ✅ 推荐:
const result = (a ?? 0) + (b ?? 0); - ⚠️ 避免:
let x = a ?? b + c;(等价于a ?? (b + c),不是(a ?? b) + c) - ❌ 禁止混合
??和&&/||不加括号:a ?? b || c会报语法错误,必须写成(a ?? b) || c或a ?? (b || c)
浏览器兼容性与替代方案
现代浏览器(Chrome 80+、Firefox 74+、Safari 13.1+)及 Node.js 14+ 原生支持。如需兼容旧环境,可用 Babel 转译,或手动降级:
- 替代写法:
const value = input !== null && input !== undefined ? input : defaultValue; - 或封装工具函数:
const coalesce = (val, def) => val == null ? def : val;(注意== null可同时匹配null和undefined)

















