介绍
例子:假如有个这样的对象:
let user = {
name: "jeff",
age: 18,
live: {
game: 'ff14',
foot: 'bread'
}
}
如果是user.name
或user.live.game
,不会报错,因为有结果。
但如果是user.sick
,因为user对象里面没有sick,就会返回undefined
。
再进一步来说,如果user.sick.a
,会直接报错,这是因为sick本来就不存在(undefined/null),而还要在不存在里面找另一个不存在的东西,就自然而然的报错。这只是个简单的例子,如果平常没注意,就会造成这种情况,为了避免这种情况,可以选择使用可选链。如user.sick?.a
user.sick?.a
不会报错,原因就在与?.
,这个代表着可选链的左边是否存在(是否是undefined/null),如果不存在,就停止运算并返回该部分,反之,存在就继续运算后面的部分直到有结果。
其他变体 ?.[] 与 ?.()
例如:
let fun = {
user(){
console.log('user')
}
}
想执行user()
方法,但不确定有没有这个,可以使用可选链:fun.user?.()
,有就执行,没有就会返回undefined。
同理,如果不想使用 .
来访问对象里面的属性,可以使用[]
,同样可使用可选链,如上面介绍里面的例子:
user.sick?.[a] //同理
小技巧
可选链可以配合delete
使用,如下:
delete user.name //存在就删除,不存在就不执行
注意:虽然可选链可读可删,但不能写,否则报错。