??= 仅在左侧为 null 或 undefined 时赋值,默认值不覆盖 0、''、false 等 falsy 值;而 ||= 在所有 falsy 值(含 0、''、false)时均触发赋值,易误改合法值。

逻辑空赋值运算符 ??= 用于**仅在左侧变量为 null 或 undefined 时,才将其赋值为右侧的默认值**。它比传统的 ||= 更精准,避免了对假值(如 0、''、false)的误覆盖。
为什么不用 ||=?
||= 是“逻辑或赋值”,只要左边是 falsy 值(包括 0、''、false、null、undefined、NaN),就会触发赋值——这往往不符合“只设默认值”的本意。
例如:
let count = 0; count ||= 10; // ❌ 触发赋值!count 变成 10(但 0 是合法有效值)
??= 的正确用法
它只在左侧为 null 或 undefined 时才赋值,保留其他所有真实值(包括 0、false、'')。
-
let name; name ??= '匿名';→name是undefined,赋值为'匿名' -
let age = 0; age ??= 18;→age是0(非 null/undefined),不赋值,仍为0 -
let isActive = false; isActive ??= true;→ 保持false,不覆盖
替代写法对比(更简洁)
过去常用三元或 if 判断实现类似逻辑:
// 传统方式(啰嗦) if (user.name == null) user.name = '未知'; // 或 user.name = user.name !== null && user.name !== undefined ? user.name : '未知'; // 现在一行搞定 ✅ user.name ??= '未知';
适用常见场景
- 函数参数默认值补全(尤其解构后未传参的属性)
- 配置对象初始化:
config.timeout ??= 5000; - 状态变量兜底:
currentTab ??= 'home'; - 避免重复判断:比
typeof x === 'undefined' || x === null直观得多
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











