十甫寸木南
Articles10
Tags6
Categories0
TypeScript: Nullish Coalescing (空值合并) —— ??

TypeScript: Nullish Coalescing (空值合并) —— ??

Created By: 十甫寸木南
Last Edited: Feb 03, 2020 10:03 PM

看到这篇文章标题的第一眼,是不是有点懵呢?

mengbi

好吧,可能知道的人一点儿也不懵,但是,不知道的人肯定是懵的!这点,毋庸置疑,比如我自己😂😂

说实话,第一次看到这两个单词 “Nullish Coalescing” 的时候,我是非常懵的,因为第 2 个单词我不认识😂(请原谅我的愚蠢)。

经过查阅资料(翻译),我认识了这个单词 “coalesce” ,它是个动词,是 “合并,联合” 的意思😄。

所以,这个 “Nullish Coalescing” 整体的意思呢,就是 “空值合并”。

jilinggui

但是,虽然 “空”、“值”、“合”、“并” 这 4 个字我都认识,但是,合在一起后,我就又不认识了😢

2mengbi

于是,我又继续往下看了看,突然,我似乎明白了!

zhenxiang

我看到了一个操作符!

没错,就是 ——> ??

好吧,虽然看到了 ?? ,但我还是不明白这个 ?? 到底代表的是什么?

3mengbi

ai

我还是看看官方爸爸的文档吧!

定义

遇到一个新的概念,先看定义!

官方爸爸给出的定义是这样的:

The nullish coalescing operator is another upcoming ECMAScript feature that goes hand-in-hand with optional chaining, and which our team has been involved with championing in TC39.

em…

即将到来的 ECMAScript 的功能?有点小期待呢😄

好吧,这句话没啥用!继续往下看!

You can think of this feature - the ?? operator - as a way to “fall back” to a default value when dealing with null or undefined.

咦咦咦!似乎有点意思哦!继续往下看!

let x = foo ?? bar();

一行代码,而且用到了主角 ?? ,那么,这个神秘的 ?? 到底起什么作用呢?

官方爸爸再次给出了一句话:

this is a new way to say that the value foo will be used when it’s “present”; but when it’s null or undefined, calculate bar() in its place.

看到这里,我恍然大悟!

原来如此!搜噶!

zheyanga

简单来说,let x = foo ?? bar(); 中,如果 foonullundefined ,则 x = bar() , 否则 x = foo ;

代码对比

看完了官方的解释,我真是差点笑出猪叫😂

话不多说,来看下代码对比:

  • 版本一:

      let x = (foo !== null && foo !== undefined)
          ? foo
          : bar();
  • 版本二:

      let x = foo ?? bar();

简直不要太方便啊!

kaixin

突然,我想到一个问题,虽然这个 ?? 确实很方便,但是,我以前也可以很方便的实现啊!

比如这样:

let x = foo || bar();

ninggu

突然,我又给了自己一巴掌,真是傻*!

shanziji

注意( ?? 真正的好处)

let x = foo || bar();

这行代码虽然看似也解决了 foonullundefined 的这个难题,但是,这行代码其实是一个真正的货真价实的坑货!

quede

存在一种情况,如果 foo = 0

这个时候,简直是 B le 🐶了,0 默认和 false 是相等的,也就是说,这个时候,即便 foo 实际上是有值的(虽然为 0 ),但是,最终的结果依旧会是 x = bar()

这简直错到离谱!

但是,很多时候,我们往往会出现这样的思维误区,并且难以发现!

?? 就避免了这样的隐患!

所以,如果你的 TypeScript 版本在 3.7 以上,那么请使用 ?? ,而不是下面的愚蠢形式:⬇️

let x = (foo !== null && foo !== undefined)
    ? foo
    : bar();

如果你的 TypeScript 版本在 3.7 以下,请尽量升到 3.7 以上!

biantai