链式选项(optional chaining)

链式选项 ?. 是在 ES2020 引入的一个新特性。它改变了深层嵌套对象属性值的获取方式。它修复了在获取一长链对象属性的时候不得不进行多次 null 检查的问题。

?. 可以用来检查链式属性的值是否为 null 或者 undefined

  1. const prop = obj?.prop1?.prop2?.someProp;

如果任意链式属性的值为 null 或者 undefined ,那么 JS 会返回 undefined

  1. let user
  2. console.log(user?.id) // undefined

空合并操作符(nullish coalescing operator)

空合并操作符( ?? )是一个逻辑操作符,如果左侧的操作数(operand)是 null 或者 undefined ,那么它会返回右侧的操作数,反之返回左侧。
与之类似的是逻辑或( || )操作符,如果左侧的操作数返回任意的 falsy 值,不仅 nullundefined ,它就会返回右侧的操作数。例如,如果左侧的操作数是 '' 或者 0 时,而你又认为它是正确的数,这时候就可以考虑使用 ?? 来规避相关问题。

  1. const foo = null ?? 'default string'
  2. console.log(foo) // default string
  3. const bar = 0 ?? 42
  4. console.log(bar) // 0
  1. let customer = {
  2. name: 'Carl',
  3. details: {
  4. age: 82
  5. }
  6. }
  7. const customerCity = customer?.city ?? 'Unknown city'
  8. console.log(customerCity) // Unknown city

操作符优先级

优先级 操作类型 可结合性 单独操作符
21 Grouping n/a ( … )
20 member access 左到右 xx . xx
computed member access 左到右 … [ … ]

详细参考operator precendence