逻辑空赋值运算符(??=)与可选链操作符(?.)配合,可安全简洁地为嵌套对象空属性赋默认值:当路径存在且值为null/undefined时才赋值,避免报错并替代冗长的嵌套检查。

逻辑空赋值运算符(??=)和可选链操作符(?.)可以安全、简洁地初始化嵌套对象属性,尤其适合处理可能为 null 或 undefined 的深层结构。
避免访问空值时的报错
可选链 ?. 会在左侧操作数为 null 或 undefined 时短路返回 undefined,不触发错误。这为后续使用 ??= 提供了安全前提。
例如:
const user = { profile: null };
user.profile?.settings ??= {}; // 不报错,也不执行赋值
console.log(user); // { profile: null }
仅当路径存在且目标值为空时才赋默认值
??= 只在左侧值为 null 或 undefined 时才赋值;结合 ?.,就能精准作用于“路径可达但值为空”的场景。
立即学习“Java免费学习笔记(深入)”;
常见写法:
-
obj?.prop ??= defaultValue:确保obj存在且prop为空时才设默认值 -
obj?.nested?.config ??= { theme: 'light' }:多层安全访问 + 空值初始化 -
data?.items?.[0]?.name ??= 'Untitled':带可选索引和属性的组合
替代冗长的嵌套检查逻辑
过去常用 if 或三元嵌套来保障路径安全:
// 传统写法
if (user && user.profile && user.profile.settings == null) {
user.profile.settings = {};
}
// 现代写法(等效且更清晰)
user?.profile?.settings ??= {};
后者语义明确:「如果 profile.settings 这条路径有效且当前为空,就设为默认对象」。
注意边界情况与兼容性
?. 和 ??= 都是 ES2020+ 特性,需确认运行环境支持(现代浏览器和 Node.js 14+ 均支持)。另外需留意:
-
??=是赋值操作符,不能用于表达式左侧为不可赋值的场景(如字面量、函数调用结果) -
a?.b ??= c中,a?.b必须是一个可被赋值的引用(即a.b本身可写),否则会报Invalid left-hand side in assignment - 若
a为undefined,a?.b ??= c完全不执行,不会创建a或b










