?. 和 ??

比如我们需要一个变量,是数组且有长度,才做某些操作

const list = null
// do something
if (list && list.length) {
  // do something
}

// 使用可选链
const list = null
// do something
if (list?.length) {
  // do something
}

比如有一个对象,我要取一个可能不存在的值,甚至我们都不确定 obj 是否存在

const obj = {
  cat: {
    name: '哈哈'
  }
}
const dog = obj && obj.dog && obj.dog.name // undefined

// 可选链
const obj = {
  cat: {
    name: '哈哈'
  }
}
const dog = obj?.dog?.name // undefined

比如有一个数组,我不确定它存不存在,存在的话就取索引为 1 的值

const arr = null
// do something
const item = arr && arr[1]

// 可选链
const arr = null
// do something
const item = arr?.[1]

比如有一个函数,我们不确定它存不存在,存在的话就执行它

const fn = null
// do something
const res = fn && fn()

// 可选链
const fn = null
// do something
const res = fn?.()
const a = 0 || 'Lance' // Lance
const b = '' || 'Lance' // Lance
const c = false || 'Lance' // Lance
const d = undefined || 'Lance' // Lance
const e = null || '林三心' // Lance

??|| 最大的区别是,在 ?? 这,只有 undefinednull 才算假值

const a = 0 ?? 'Lance' // 0
const b = '' ?? 'Lance' // ''
const c = false ?? 'Lance' // false
const d = undefined ?? 'Lance' // Lance
const e = null ?? 'Lance' // Lance

||= 和 &&=

或等于(||=)   a ||= b 等同于 a || (a = b);

且等于(&&=)   a &&= b 等同于 a && (a = b);