1.指数运算符(**)

这个运算符的一个特点是右结合,而不是常见的左结合。多个指数运算符连用时,是从最右边开始计算的。

2.链式运算符

运算符的扩展_运算符
三元运算符?:也常用于判断对象是否存在。
运算符的扩展_三元运算符_02
上面代码使用了?.运算符,直接在链式调用的时候判断,左侧的对象是否为null或undefined。如果是的,就不再往下运算,而是返回undefined。
链判断运算符?.有三种写法。

obj?.prop // 对象属性是否存在
obj?.[expr] // 同上
func?.(...args) // 函数或对象方法是否存在

短路机制:
本质上,?.运算符相当于一种短路机制,只要不满足条件,就不再往下执行。
运算符的扩展_默认值_03
如果a是undefined或null,那么x不会进行递增运算。也就是说,链判断运算符一旦为真,右侧的表达式就不再求值。

3.Null判断运算符

读取对象属性的时候,如果某个属性的值是null或undefined,有时候需要为它们指定默认值。常见做法是通过||运算符指定默认值。但是属性的值如果为空字符串或false或0,默认值也会生效。为避免这种情况,引入新的 Null 判断运算符??
运算符的扩展_空字符串_04
只有左侧是null或者undefined才会返回右侧的值