在编写JavaScript代码时,经常需要首先检查一个变量是否为null或undefined,再访问其中的属性或调用其中的方法。典型的模式如下:
if (obj) { obj.func(); }
使用if进行检查的代码比较冗长,一般可以简写成下面的形式。
let value = obj && obj.value;
obj && obj.func();
JavaScript目前并没有提供Groovy或Ruby语言中那样的安全引用操作符(?.)。比较接近的是CoffeeScript中提供了这样的操作符。CoffeeScript中的代码value = a?.b?.c会被编译成如下的JavaScript代码。
var ref, value;
value = typeof a !== "undefined" && a !== null ? (ref = a.b) != null ? ref.c : void 0 : void 0;
在JavaScript方面,增加安全引用操作符的提议已经存在,目前还是在第一阶段。该提议的名称是JavaScript中的可选级联(Optional Chaining for JavaScript),使用的同样是?.来表示该操作符。该操作符有如下几种使用场景:
obj?.prop// 可选的静态属性访问obj?.[expr]// 可选的动态属性访问func?.(...args)// 可选的方法调用
在该提议正式被添加到ECMAScript规范之后,相关的厂商会跟进实现。TypeScript也计划在那之后添加对该操作符的支持。