ES11新增,用来安全的链式访问深层次的属性,**?.** 使用方式与属性访问符 . 的方式相同**

    1. obj.prop?.target // 属性访问
    2. obj.prop?.['targetName'] // 属性表达式
    3. obj.array?.[13] // 访问数组元素
    4. obj.method?.(args) // 方法调用
    5. func?.(args)
    • 如果引用目标为空时(null、undefined),就会短路表达式,并返回 undefined
      • 引用目标:即 ?. 左边的属性
      • 如果直接使用在对象上 obj?.prop,就和使用 . 效果相同
    • 调用函数时也可以使用,如果函数为空就返回 undefined,存在就调用
    • 可选链只能用于访问属性,不能进行赋值

    使用场景
    当需要链式访问某个深层次的属性时,可能会应为中间某个属性不存在,而引发报错

    obj.a.b
    
    • 如果对象中没有a这个属性,就会引发错误 Cannot read property 'c' of undefined

      obj.a && obj.a.b
      obj.a && obj.a.b && obj.a.b.c && obj.a && obj.a.b.c.d
      
    • 因此需要先对属性进行非空判断,再去访问内部的值,但是当层级过深时,这样写非常的不便

      obj.a?.b?.c?.d
      
    • 只要表达式中的任意一个属性为空,该表达式就会短路,不会引发错误且可读性较强