ES 新增特性 ?? 、 ??= 、 ?. 、 &&=

173 阅读1分钟

在之前有 ?:(三元运算符),简单例子。

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)   // false2function 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