介绍
例子:假如有个这样的对象:
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 //存在就删除,不存在就不执行
注意:虽然可选链可读可删,但不能写,否则报错。
