js 中 空值赋值运算符 的用法
**
空值赋值运算符 (??=)
**
含义解说 :
当空值赋值运算符 ??= ,
左侧的值为null、undefined的时候, 才会将右侧变量的值赋值给左侧变量。其他所有值都不会进行赋值。同样在一些场景下,可以省略很多代码. 即 xx ??= 00 ,也就是说xx 为null / undefined 时候 会把00 赋值给xx ,否则保留xx的本值。
上例子
let b = '你好';
let a = 0
let c = null;
let d = '123'
console.log(b ??= a, b, a ); // b = “你好”, 你好, 0
console.log(c ??= d,c, d ) // c = '123' 123, 123
再看一个简单的例子
let a;
let b = "不知名前端"
let c = null;
let d = 0;
let e;
e ??= a?.b ?? c ?? d?.a ?? b;
console.log(e) // 不知名前端
为什么呢?
解说一下,此时a,e,c, 我们都知道 a,e 都是undefined,满足赋值右侧条件,但是右侧是个判断,所以要执行右边的判断赋值。
console.log(a?.b) // a为undefined 了,那后边的b 也就自然不存在了 结果就是 undefined
那么b下边的c 是啥呢 如果一致 用 ?. 那后边都是undefined。
但是变成了 ?? 此时就要 合并了,也就是把后边的结果给前边,此时的
e ??= a?.b ?? c 就为null了。
然而我们并没有结束 e ??= a?.b ?? c ?? d 此时我们把 d 的值拿来用了一下。e ??= a?.b ?? c ?? d 就为 0 了。
到这里的时候你该说这个时候e就为 0 了,后边的不用走了。
但是其实它又进行了执行结果
d?.a ;d下边没有这个a属性和值,此时 结果就是undefined
这就又回到了最初的时候 null / undefined
那么 e ??= a?.b ?? c ?? d?.a ?? b; 的值就是 b 的值
你彻底理解了吧。