Nullish Coalescing

TypeScript

Nullish Coalescing 当前在 TC39 Stage 3 的阶段,TypeScript 在 3.7 中也将这一功能引入了进来。(Coalesce 是“合并;联合;接合”的意思)

Nullish Coalescing 的简单用法如下:

let x = foo ?? bar();

foo 的值是 null 或者 undefined 的时候,x 的值由后面的 bar() 决定,否则 x 的值就是 foo 本身。这一行为,一般会被用于给变量赋初始值。在之前的 JavaScript / TypeScript 中,一般会这么写:

function getNumber(num: number) {
  return num || 5;
}

但是,这样写有一个问题,就是当 num 的值是 0 的时候,最终的值依然是 5 而不是 0。这一行为很可能并不是开发者希望的。

和 Optional Chaining 一样,Nullish Coalescing 只有在原值是 null 或者 undefined 的时候,才进行操作;其他的 falsy 值,都会保持原样,并不会做特殊的处理(根据 Proposal 中的说明,这两个规范将会在“何时处理”上保持一致)。这很大程度上减少了 JavaScript 在类型上导致隐藏问题的可能性。

需要注意的一点是,这一行为和 JavaScript 中的默认参数是有一点不一样的。上面的代码如果改写成默认参数的形式:

function getNumber(num: number = 5) {
  return num;
}

那么,将会在 getNumber(null) 的时候产生行为上的分歧。使用 Nullish Coalescing 将会返回 5,也就是进行了默认值赋值;而默认参数的方案将会返回 null,因为默认参数只有在 undefined 的情况下才会进行默认值赋值操作。

Optional Chaining 和 Nullish Coalescing 可以放在一起操作,确保值不存在的时候,有一个兜底的默认值可以给程序使用:

let x = foo?.bar?.() ?? 'default';