快速了解空值合并运算符和其他有趣的操作符

130 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

空值合并操作符

空值合并操作符??)是一个逻辑操作符,当左侧的操作数为 null 或者 undefined 时,返回右侧的操作数,否则返回左侧的操作数。

提供默认值

保证变量不为 null 或者 undefined

表达式求值

与 OR 和 AND 逻辑操作符相似,当左表达式不为 nullundefined 时,不会对右表达式进行求值。

function A() { console.log('调用 A'); return undefined; }
function B() { console.log('调用 B'); return false; }
function C() { console.log('调用 C'); return "foo"; }

console.log( A() ?? C() );
// 输出:'调用 A'、'调用 C'、'foo'

console.log( B() ?? C() );
// 输出:'调用 B'、false

不能与 AND(&&) 或 OR(||) 操作符共用

当空值合并操作符和AND(&&) 或 OR(||) 操作符共用时,会抛出 SyntaxError 报错。

目前猜测原因有二:

  • ?? 运算符和其他逻辑操作符之间的运算优先级/运算顺序是未定义的,可能导致运算错误
  • 避免开发者在切换 || 为 ?? 时的可能会出现的混淆

可以通过括号明确优先级,以避免报错。

与可选链操作符 ?. 的关系

空值合并操作符针对 undefinednull 这两个值,可选链式操作符?.) 也是如此。在这访问属性可能为 undefinednull 的对象时,可选链式操作符非常有用。

逻辑或操作符 ||

以前,如果想为一个变量赋默认值,通常的做法是使用逻辑或操作符||)。

然而,由于 || 是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值(0''NaNnullundefined)都不会被返回。

不可预料的后果

如果左侧的操作数是 0''NaN 时,会返回右侧的操作数。

空值合并操作符可以避免这种陷阱,其只在第一个操作数为nullundefined 时(而不是其它假值)返回第二个操作数。

let count = 0;
console.log(count || 42);     // 输出:42

let count = 0;
console.log(count ?? 42);     // 输出:0

总结

在实际应用场景中,我们通常使用 || 操作符来为变量设置兜底的默认值,使用它时,只要左侧操作数为假值,就会使用右侧操作数。但是,如果某种场景,我们只想给 “未定义的变量” 赋值时,就可以使用 ?? 操作符,从而接受左侧操作数为假值的场景。