ES6+ 可选链操作符
1. 前言
var obj = {}
console.log(obj.a) // undefined
console.log(obj.a.b) // Uncaught TypeError: Cannot read property 'b' of undefined
上面的代码中,obj 是一个对象,在获取 obj 对象的属性 a 时,属性 a 没有被定义所以返回 undefined,第 3 行获取 obj 对象 a 下的 b,由于 obj 上没有 a 属性,再获取 a 上的 b 属性就会报错。一般这样的情况,在程序中需要做前置验证,大部分情况会借助 &&
来完成。
var obj = {}
var b = obj.a && obj.a.b
console.log(b) // undefined
上面的代码中第 2 行首先会判断 obj.a
的值,如果不为空则继续执行 obj.a.b
否则返回 undefined
。这样做虽然能保证程序的健壮性,但当嵌套的对象很深时,则要对每一层进行验证,这样不利于阅读,而且容易出现程序上的错误。
2. 方法详情
作用与 .
操作符类似。不同的是 ?.
如果对象链上的引用是 null
或者 undefined
时, .
操作符会像前言中的例子抛出一个错误,而 ?.
操作符则会按照短路计算的方式进行处理,返回 undefined
。可选链操作符也可用于函数调用,如果操作符前的函数不存在,也将会返回 undefined
。下面我们来看它的使用语法:
2.1 基本语法
语法使用:
obj?.prop
obj?.[expr]
arr?.[index]
func?.(args)
参数解释:
实例
var user = {
name: 'Kira',
address: {
city: 'beijing',
other: {}
}
}
console.log(user?.name); // Kira
a?.b); // undefined
console.log(user?.address?.city); // beijing
console.log(user?.address?.other?.a?.b); // undefined
3. 使用场景
3.1 可选链和表达式
var person = {}
var name = person.getName?.();
var person = {getName: ''}
var name = person.getName?.();
// Uncaught TypeError: person.getName is not a function
3.3 可选链不能用于赋值
可选链是取值操作时所用的安全方法,不能使用在赋值操作上。
let obj = {};
obj?.name = 'imooc'; // Uncaught SyntaxError: Invalid left-hand side in assignment
3.4 可选链访问数组元素
可选链也是可以使用在数组取值的前置验证的。
var arr = []
let item = arr?.[];