在之前有 ?:(三元运算符),简单例子。
let a = true;
let b = a ? '真的' : '假的' // '真的'
?? 非空运算符
当左侧为 null 或 undefined 时取右侧值,(注:这里只有两个假值,但是 JS 中假值包含: undefined、 null、 0、 NaN、false,'')。
let a = null , b = false, c = undefined, d = NaN , e = false
console.log(a ?? 123) // 123
console.log(b ?? 123) // false
console.log(c ?? 123) // 123
console.log(d ?? 123) // NaN
console.log(e ?? 123) // false
列2:
function test(obj){
let a = obj || {}
}
等价于
function test(obj){
let a
if(obj == '' || obj == null || obj == 0 || obj == false || obj == undefined){
a = {}
}else{
a = obj
}
}
function test(obj){
let a = obj ?? {}
}
等价于
function test(obj){
let a
if(obj == null || obj == undefined){
a = {}
}else{
a = obj
}
}
??= 空赋值运算符
仅当值为 null 或 undefined 时,此赋值运算符才会赋值。 列:
let a;
let b = a ??= 2;
console.log(b) // 2
?. 链判断运算符
列:
let a = {b:{c:2}}
let rs = a?.b?.d || 3;
let rs2 = a?.b?.c || 3;
console.log(rs, rs2) //3, 2
上面两个取值等价于:
let rs = a && a.b && a.b.d || 3;
let rs2 = a && a.b && a.b.c || 3;
console.log(rs, rs2) // 3, 2
&&= 逻辑赋值运算符
只有左侧为真的时候才赋值
let a = 0, b = '123', c = false, d = null, e = undefined
console.log( a &&= 1) // 0
console.log( b &&= 1) // 1
console.log( c &&= 1) // false
console.log( d &&= 1) // null
console.log( e &&= 1) // undefined