特殊运算符(左结合、右结合、分组和短路运算符、空值合并 ??运算符、可选链?.运算符、空值赋值??=运算符)

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值