如何将带赋值的空值合并运算符转换为常规三元运算符?
空值合并赋值运算符(??=)的含义及三元语法转换
先弄明白??=到底干啥的
你代码里的obj[array[i]] ??= {},其中??=是ES2021新增的空值合并赋值运算符,逻辑很直接:
- 先判断
obj[array[i]]是否为null或者undefined(划重点:0、空字符串、false这类假值不算在内) - 如果是,就把
{}赋值给obj[array[i]],整个表达式返回这个新对象 - 如果不是,直接返回
obj[array[i]]原来的值,不会做任何修改
转成三元运算符的等价写法
要转成常规三元语法,得完全对应原逻辑,这里给出两种常用写法:
写法1:最直观的拆分版
// 先判断条件,满足时先给obj[array[i]]赋值,再把结果赋给obj obj = (obj[array[i]] === null || obj[array[i]] === undefined) ? (obj[array[i]] = {}) : obj[array[i]];
写法2:更简洁的简化版
// 利用空值合并运算符的逻辑简化,和上面效果完全一致 obj = obj[array[i]] ?? (obj[array[i]] = {});
如果不需要把结果再赋值给obj,只处理obj[array[i]]的话,三元写法是:
obj[array[i]] = obj[array[i]] === null || obj[array[i]] === undefined ? {} : obj[array[i]];
别搞混类似运算符
顺带提一句,别把??=和||=搞混:
||=是逻辑或赋值,只要左侧是假值(0、''、false、null、undefined全算)就会触发赋值??=只对null和undefined生效,其他假值不会触发赋值
内容的提问来源于stack exchange,提问作者Husky931
相关产品推荐
相关产品推荐

