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';