||
短路或 当左侧值转换成布尔类型为 false 时,返回右侧的值
* 常用于 es5 设置默认值
console.log(0 || 100); // 100console.log(false || 100); // 100console.log(null || 100); // 100console.log(undefined || 100); // 100
??
空值合并 当左侧值为 null 或 undefined 时,返回右侧的值
* 只针对 null 和 undefined
console.log(0 ?? 100); // 0console.log(false ?? 100); // falseconsole.log(null ?? 100); // 100console.log(undefined ?? 100); // 100
?.
可选链 如果对象/数组存在属性或方法可执行,则继续执行,否则返回 undefined
* 常用于属性判断,可以避免类型错误导致报错阻塞
* 适量使用,不可滥用
obj?.prop / obj?.[expr]
**_desc_**对象属性可选链_**params**_{ any } obj_**params**_{ string } prop 静态属性名称_**params**_{ string } expr 动态属性名称_**return**_{ any | undefined }
var obj;console.log(obj?.name); // undefinedconsole.log(obj.name); // TypeError: Cannot read property "name" of undefined
arr?.[index]
**_desc_**数组可选链_**params**_{ any } arr_**params**_{ number } index_**return**_{ any | undefined }
var arr;console.log(arr?.[0]); // undefinedconsole.log(arr[0]); // TypeError: Cannot read property "0" of undefined
func?.(args)
**_desc_**函数可选链_**params**_{ any } func_**params**_{ any } args_**return**_{ any | undefined }
var func;console.log(func?.()); // undefinedconsole.log(func()); // TypeError: func is not a function
