介绍

例子:假如有个这样的对象:

  1. let user = {
  2. name: "jeff",
  3. age: 18,
  4. live: {
  5. game: 'ff14',
  6. foot: 'bread'
  7. }
  8. }

如果是user.nameuser.live.game,不会报错,因为有结果。

但如果是user.sick,因为user对象里面没有sick,就会返回undefined

再进一步来说,如果user.sick.a,会直接报错,这是因为sick本来就不存在(undefined/null),而还要在不存在里面找另一个不存在的东西,就自然而然的报错。这只是个简单的例子,如果平常没注意,就会造成这种情况,为了避免这种情况,可以选择使用可选链。如user.sick?.a

user.sick?.a 不会报错,原因就在与?.,这个代表着可选链的左边是否存在(是否是undefined/null),如果不存在,就停止运算并返回该部分,反之,存在就继续运算后面的部分直到有结果。

其他变体 ?.[] 与 ?.()

例如:

  1. let fun = {
  2. user(){
  3. console.log('user')
  4. }
  5. }

想执行user()方法,但不确定有没有这个,可以使用可选链:fun.user?.(),有就执行,没有就会返回undefined。

同理,如果不想使用 .来访问对象里面的属性,可以使用[],同样可使用可选链,如上面介绍里面的例子:

  1. user.sick?.[a] //同理

小技巧

可选链可以配合delete使用,如下:

  1. delete user.name //存在就删除,不存在就不执行

注意:虽然可选链可读可删,但不能写,否则报错。