js中可选链操作符——?.

JavaScript09

js中可选链操作符——?.,第1张

可选链 操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。 ?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空( nullish ) ( null 或者 undefined ) 的情况下不会引起错误,该表达式短路返回值是 undefined 。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined 。

当尝试访问可能不存在的对象属性时,可选链操作符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链操作符也是很有帮助的。

为了避免报错,在访问obj.first.second之前,要保证 obj.first 的值既不是 null,也不是 undefined。如果只是直接访问 obj.first.second,而不对 obj.first 进行校验,则有可能抛出错误。

有了可选链操作符(?.),在访问 obj.first.second 之前,不再需要明确地校验 obj.first 的状态,再并用短路计算获取最终结果:

摘自: 可选链操作符

?. 表示可选链,就是如果对象存在,就获取.后面的属性值。

举个例子,假定对象obj未定义(或者说不存在),那么下面的语句会报错:

let type = obj.type

而改成这样就不报错了:

let type = obj?.type

当obj不存在时,变量type的值为undefined。

?? 则是空值合并运算符,就是如果??左边的表达式是null或undefined,则获取??右边的表达式的值。

比如

let type = x ?? 'haha'

意思就是如果x是空值,则type='haha',否则type=x

以上两种合起来用的话,比如

let type = obj?.type ?? ''

意思就是,如果obj存在,且obj.type不是null或undefined,则type=obj.type,否则的话type就赋值为空字符串。

如果用常规写法,那么代码就复杂得多:

if (obj &&obj.type) {

let type = obj.type

}else{

let type = ''

}