Optional Chaining 解决的问题是重复且无意义的判空,之所以说无意义,是对业务来说它不是必需的,但不判空,程序直接就挂了,比如:

let x = foo.bar.baz();
 

这里的访问链路上 foo bar baz 任何一个为 undefined,程序就停止工作。

使用 Optional Chaining 修改后:

let x = foo?.bar.baz();
 

这里 ?. 的句法就是 Optional Chaining,在 TypeScript 3.7 中实现,目前 tc39 提案中处于 Stage 4 阶段。

Optional Chaining 在这里表示,如果 foonullundefined,整个语句不继续往后执行,直接返回 undefined

作用范围

需要注意的是,这里只对 foo 进行了保障,如果后续的 barbaz 为空的话,代码仍然报错。?. 只作用于左边的对象。

所以可以这样来修正:

let x = foo?.bar?.baz();
 

这样可以保障 foo bar 为空的情况下不报错。这体现了 optional property accesses 的功能。

Opptoinal call

对于方法也同样适用。

async function makeRequest(url: string, log?: (msg: string) => void) {
log?.(`Request started at ${new Date().toISOString()}`);
// roughly equivalent to
// if (log != null) {
// log(`Request started at ${new Date().toISOString()}`);
// } const result = (await fetch(url)).json(); log?.(`Request finished at at ${new Date().toISOString()}`); return result;
}
 

Optional element access

数组也是对象,只不是特殊的对象,通过数字索引作为属性来访问。所以 Optional Chaining 也可作用于数组元素的访问,此时就体现了 optional element access 的功能,请看来自官方文档中的示例:

/**
* Get the first element of the array if we have an array.
* Otherwise return undefined.
*/
function tryGetFirstElement<T>(arr?: T[]) {
return arr?.[0];
// equivalent to
// return (arr === null || arr === undefined) ?
// undefined :
// arr[0];
}
 

&& 的差别

虽说 Optional Chaining 取代了如下通过 && 来实现的判空操作:

// Before
if (foo && foo.bar && foo.bar.baz) {
// ...
}
 

但 Optional Chaining 和 && 还是有区别,后者利用 JavaScript 中的短路机制,遇到假值时中断执行。而前者只会在被判定对象为 nullundefined 时才会中断执行。

请看如下示例:

const a: any = 0;
console.log(a?.blah);
console.log(a && a.blah); const b: any = false;
console.log(b?.blah);
console.log(b && b.blah); const c: any = "";
console.log(c?.blah);
console.log(c && c.blah);
 

输出:

undefined
0
undefined
false
undefined
 

可以看到,通过 Optional Chaining 控制的部分全部输出 undefined,因为这里被判定对象并不是 nullundefined,所以语句会往后执行,尝试访问 blah,拿到的值是 undefined,最后输出。

而通过 && 进行判定的语句,因为被判定对象是假值,中断执行并返回当前对象。

Nullish Coalescing

Nullish Coalescing 通过 ?? 操作符,为 nullundefined 的值提供默认值。

比如:

let x = foo ?? bar();
 

上面的表达式等价于如果 foonullundefined,则调用 bar()

同样地,他取代了之前通过 || 操作符达到的默认值效果,但后者同样是通过判断布尔真值达到的,而 Nullish Coalescing 只判断 nullundefined

比如:

function initializeAudio() {
let volume = localStorage.volume || 0.5; // ...
}
 

这里如果 localStorage.volume 被设置成 0,则最后 volume 得到的是 0.5,也就是说设置在 localStorage.volume 永远也不会生效。而 Nullish Coalescing 就可以避免这种问题。

相关资源

The text was updated successfully, but these errors were encountered:

TypeScript 中 Optional Chaining 和 Nullish Coalescing的更多相关文章

  1. [TypeScript] Optional Chaining with TypeScript 3.7

    TypeScript 3.7 adds support for optional chaining. This lesson shows you how to use it in your code ...

  2. TypeScript 3.7 RC & Optional Chaining

    TypeScript 3.7 RC & Optional Chaining https://devblogs.microsoft.com/typescript/announcing-types ...

  3. TypeScript 3.7 RC & Nullish Coalescing

    TypeScript 3.7 RC & Nullish Coalescing null, undefined default value https://devblogs.microsoft. ...

  4. Swift中可选型的Optional Chaining 和 Nil-Coalesce(Swift2.1)

    /* 下面是介绍Optional Chaining 和 Nil-Coalesce */ // Optional Chaining (可选链) if let errorMessage = errorMe ...

  5. 精读《Optional chaining》

    1. 引言 备受开发者喜爱的特性 Optional chaining 在 2019.6.5 进入了 stage2,让我们详细读一下草案,了解一下这个特性的用法以及讨论要点. 借着这次精读草案,让我们了 ...

  6. js optional chaining operator

    js optional chaining operator js 可选链 可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效. ?. 操作符的功能类似于 ...

  7. Welcome-to-Swift-17自判断链接(Optional Chaining)

    自判断链接(Optional Chaining)是一种可以请求和调用属性.方法及子脚本的过程,它的自判断性体现于请求或调用的目标当前可能为空(nil).如果自判断的目标有值,那么调用就会成功:相反,如 ...

  8. Swift Optional Chaining

    Optional Chaining介绍 关于「optional chaining」,<The Swift Programming Language>是这么描述的: Optional cha ...

  9. Typescript & React & optional parameters & default parameters

    Typescript & React & optional parameters & default parameters Typescript & optional ...

随机推荐

  1. 面试准备——计算机网络(http)

    一.各种协议与HTTP协议之间的关系 二.URI(统一资源标识符) URI用字符串标识某一互联网资源. URI的格式: 协议方案名:指定访问资源时使用的协议类型. 登录信息(认证):可选,指定用户名和 ...

  2. PAT B1039/A1092 到底买不买项链

    小红买些珠子做项链,但是卖家不肯拆散了卖,于是帮忙判断一下,某串珠子是否全部包含自己想要的珠子,如果是告诉她有多少多余的珠子,如果不是,又缺了那些珠子现在为了方便起见用"0-9"& ...

  3. 数据库MySQL四

    一.测试题 二.复习 说明:sql中的函数分为单行函数和分组函数 调用语法:select 函数名(实参列表); 1>字符函数 concat(str1,str2,..):拼接字符 substr(s ...

  4. 从应用层到网络层排查 Dubbo 接口超时全记录

    大家好,我是坤哥 我们常说面试造火箭,很多人对此提出质疑,相信大家看了这篇文章会明白面试造火箭的道理,这篇排查问题的技巧涉及到索引,GC,容器,网络抓包,全链路追踪等基本技能,没有这些造火箭的本事,排 ...

  5. 让你的Windows/Linux玩上Switch!

    1 前言 某天在Github上面看到了两个Switch的模拟器: yuzu Ryujinx 于是就想动手想尝试一下在Linux上面玩上Switch. 本文首先简单介绍一下两个模拟器,接着是两个模拟器的 ...

  6. BPF for storage:一种受外核启发的反式

    BPF for storage:一种受外核启发的反式 译自:BPF for storage: an exokernel-inspired approach BPF主要用于报文处理,通过绕过网络栈提高报 ...

  7. Day05_26_Overide_方法重写

    Overide_方法重写 * 什么是方法重写(Overide)? - 方法重写也叫方法覆盖 ,重写是指子类对父类所允许访问的方法的实现过程进行重新编写, 返回值类型和形参都不能改变.即外壳不变,核心重 ...

  8. Pandas——Series and DataFrane

    数据科学--pandas库 pandas中有两个主要的数据结构,一个是Series,另一个是DataFrame.通过这两类数据,可以下载数据.可视化数据.和分析数据. Pandas安装:pip ins ...

  9. 12- winmerge讲解

    WinMerge是一款运行于Windows系统下的免费开源的文件比较/合并的工具,使用它可以非常方便的比较多个文档内容设置是文件夹与文件夹之间的差异.适合程序员或者经常撰写文稿的朋友使用.

  10. PHP版DES算法加密数据

    php7之后的版本 php的mcrypt 扩展已经过时了大约10年,并且用起来很复杂.因此它被废弃并且被 OpenSSL 所取代. 从PHP 7.2起它将被从核心代码中移除并且移到PECL中.PHP手 ...