空值合并操作符(??)是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。
设置默认值
通常我们在设置默认值的时候会用 || 在左值为ture的情况下没问题
let a = 2
let sex = a || 1
// sex = 2
由于 || 是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值(0, ‘’, NaN, null, undefined)都不会被返回。这导致如果你使用0,’'或NaN作为有效值,就会出现不可预料的后果。
let a = 0
let sex = a || 1
// sex = 1
如果是用
let a = 0
let sex = a ?? 1
// sex = 0
短路操作
function A() { console.log('函数 A 被调用了'); return undefined; }
function B() { console.log('函数 B 被调用了'); return fasle; }
function C() { console.log('函数 C 被调用了'); return 'c'; }
console.log( A() ?? C() );
// 依次打印 "函数 A 被调用了"、"函数 C 被调用了"、"foo"
// A() 返回了 undefined,所以操作符两边的表达式都被执行了
console.log( B() ?? C() );
// 依次打印 "函数 B 被调用了"、"false"
// B() 返回了 false(既不是 null 也不是 undefined)
// 所以右侧表达式没有被执行