||

短路或 当左侧值转换成布尔类型为 false 时,返回右侧的值

* 常用于 es5 设置默认值

  1. console.log(0 || 100); // 100
  2. console.log(false || 100); // 100
  3. console.log(null || 100); // 100
  4. console.log(undefined || 100); // 100


??

空值合并 当左侧值为 null 或 undefined 时,返回右侧的值

* 只针对 null 和 undefined

  1. console.log(0 ?? 100); // 0
  2. console.log(false ?? 100); // false
  3. console.log(null ?? 100); // 100
  4. console.log(undefined ?? 100); // 100


?.

可选链 如果对象/数组存在属性或方法可执行,则继续执行,否则返回 undefined

* 常用于属性判断,可以避免类型错误导致报错阻塞
* 适量使用,不可滥用

obj?.prop / obj?.[expr]

**_desc_** 对象属性可选链 _**params**_ { any } obj _**params**_ { string } prop 静态属性名称 _**params**_ { string } expr 动态属性名称 _**return**_ { any | undefined }

  1. var obj;
  2. console.log(obj?.name); // undefined
  3. console.log(obj.name); // TypeError: Cannot read property "name" of undefined

arr?.[index]

**_desc_** 数组可选链 _**params**_ { any } arr _**params**_ { number } index _**return**_ { any | undefined }

  1. var arr;
  2. console.log(arr?.[0]); // undefined
  3. console.log(arr[0]); // TypeError: Cannot read property "0" of undefined


func?.(args)

**_desc_** 函数可选链 _**params**_ { any } func _**params**_ { any } args _**return**_ { any | undefined }

  1. var func;
  2. console.log(func?.()); // undefined
  3. console.log(func()); // TypeError: func is not a function