1、赋值运算符属于右结合
console.log(a = b = 5); // 相当于 a = (b = 5);
预期结果是
a
和b
的值都会成为 5。这是因为赋值运算符的返回结果就是赋值运算符右边的那个值。
具体过程是:首先
b
被赋值为 5,然后a
也被赋值为b = 5
的返回值,也就是 5
2、只有幂运算符是右结合的,而其他算术运算符都是左结合的
一般算术运算符都是左结合:
console.log(6 / 3 / 2) // 1
console.log((6 / 3) / 2 ) // 1
而幂运算符是右结合:
console.log(2 ** 3 ** 2) // 512
console.log(2 ** (3 ** 2)) // 512
console.log((2 ** 3) ** 2) // 64
3、分组和短路运算符
分组(Grouping) 具有最高优先级。然而,这并不意味着总是优先对分组符号 ( … )
内的表达式进行求值,尤其是涉及短路时。
短路是条件求值的术语。例如,在表达式 a && (b + c)
中,如果 a
为虚值(falsy),那么即使 (b + c)
在圆括号中,也不会被求值。
常见的短路运算符:
逻辑或 ||
逻辑与 &&
空值合并 ??
可选链 ?.
条件(三元)运算符 ?:
a || (b * c); // 首先对 `a` 求值,如果 `a` 为真值则直接返回 `a`
a && (b < c); // 首先对 `a` 求值,如果 `a` 为虚值则直接返回 `a`
a ?? (b || c); // 首先对 `a` 求值,如果 `a` 不是 `null` 或 `undefined` 则直接返回 `a`
a?.b.c; // 首先对 `a` 求值,如果 `a` 是 `null` 或 `undefined` 则直接返回 `undefined`
4、空值合并 ??运算符
当一个值存在,或者值等于0的时候,当做这个条件是存在的。
也就是当a除了undefined 或者 null 之外的任何值,b都会等于a,否则等于c
let a = 0;
let b;
let c = { name: '小草莓' }
if (!!a || a === 0) {
b = a;
} else {
b = c;
}
console.log(b) // 0
简写成:
let a = 0;
let b;
let c = { name: '小草莓' }
b = a ?? c
console.log(b) // 0
5、可选链?.运算符
let a;
let b;
if (!!a) {
b = a.name;
} else {
b = undefined;
}
console.log(b) // undefined
简写成:
a存在且具有name属性的时候,才会把值赋给b,否则就会将undefined赋值给b
重要的是,不管a是否存在,这么做都不会报错。 这个就是可选链
let a;
let b;
b = a?.name
console.log(b) // undefined
6、空值赋值??=运算符
当??=左侧的值为null、undefined的时候,才会将右侧变量的值赋值给左侧变量,其他所有值都不会进行赋值。
let a = 0
let b = '我是b'
let c = null;
let d = '我是d'
b ??= a;
console.log(b) // 我是b
c ??= d
console.log(c) // 我是d