??= 仅在左侧为 null 或 undefined 时赋值,精准避免覆盖 0、false、'' 等 falsy 有效值;等价于 if (a === null || a === undefined) a = b;适用于默认值初始化、对象补全、配置合并等场景。

逻辑空赋值运算符 ??= 用于仅在左侧操作数为 null 或 undefined 时,才将其赋值为右侧的值。它比 ||= 更精准,不会误覆盖 0、false、'' 等“falsy 但有效”的值。
??= 的核心行为:只对 null/undefined 生效
它等价于:if (a === null || a === undefined) a = b;,不触发类型转换,也不依赖布尔求值。
-
let x; x ??= 'default';→x变为'default'(因为undefined) -
let y = null; y ??= 'fallback';→y变为'fallback' -
let z = 0; z ??= 42;→z仍是0(0不是 null/undefined,不赋值) -
let flag = false; flag ??= true;→flag保持false
替代 if 判断,简化默认值初始化
常用于函数参数、对象属性或配置项的懒初始化,避免冗长的条件检查。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 函数内初始化缓存:
function loadData() { cache ??= fetch('/api/data'); return cache; } - 对象字段补全:
user.profile ??= {}; user.profile.avatar ??= '/default.png'; - 配置合并时保留有效 falsy 值:
config.timeout ??= 5000;(即使config.timeout = 0,也不会被覆盖)
注意与 ||= 和 || 的关键区别
||= 基于“真值判断”,会把 0、false、'' 当作“空”来覆盖;??= 只认 null 和 undefined,语义更严谨。
-
let count = 0; count ||= 10;→count变成10(错误覆盖) -
let count = 0; count ??= 10;→count保持0(符合预期) - API 返回
{ price: 0 },用item.price ??= 99安全;用||=就会意外改成99
实际使用建议和边界情况
确保左侧是可赋值的左值(变量、对象属性),且运行环境支持(ES2020+,现代浏览器和 Node.js 14.0+)。
- 支持链式属性:
obj?.settings?.theme ??= 'light';(需配合可选链,否则obj.settings.theme ??= …在settings为undefined时会报错) - 不支持
const声明的变量(因为不能重新赋值):const x = undefined; x ??= 1;报错 - 可用于
let和var变量,以及对象的可写属性(包括原型链上可写的属性)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










