新增的运算符
运算符 | 运算符含义 | 操作数个数 | 操作数类型要求 | 组成的表达式的值的类型 | 组成的表达式有无副作用 |
---|---|---|---|---|---|
** | 指数运算符 | 2 | number | number | 无 |
?. | 可选链运算符 | 2 | 无 | undefined或其他 | 无 |
?? | 空值判断运算符 | 2 | 无 | 多种 | 无 |
&&= | 逻辑与赋值 | 2 | 左边操作数是变量的形式 | 左边操作数重新赋值之后的值作为表达式的值 | 有 |
||= | 逻辑或赋值 | 2 | 左边操作数是变量的形式 | 左边操作数重新赋值之后的值作为表达式的值 | 有 |
??= | 空值判断赋值 | 2 | 左边操作数是变量的形式 | 左边操作数重新赋值之后的值作为表达式的值 | 有 |
指数运算符
a ** b
js
2 ** 10; // 2 的 10 次方
89 ** 3; // 89 的 3 次方
可选链运算符
a?.b
?.
用于调用对象的属性方法,尤其适合链式调用,调用过程中一旦得到 undefined,直接结束(短路),并以undefined作为整个表达式的值。
?. 代替 .
js
对象?.属性名
对象?.属性名?.属性名
对象.方法名?.()
案例
js
const user = {
address: '上海',
age: 12,
child: {
age: 2,
address: '北京'
},
say() {
return 'say';
}
};
console.log(user.address);
console.log(user.child.address);
console.log(user.parent); // undefined
// console.log(user.parent.address); 报错
console.log('');
// ?. 代替 .
console.log(user?.address);
console.log(user?.child?.address);
console.log(user?.parent); // undefined
console.log(user?.parent?.address); // undefined
console.log('');
// 使用可选链运算符调用方法
// user.eat(); 报错 undefined不是function
console.log(user.say?.()); //say
console.log(user.eat?.()); //undefined
空值判断运算符
a ?? b
js
如果第一个操作数是 null 或者 undefined,取第二个操作数作为表达式的值;
如果第一个操作数不是 null 或者 undefined,取第一个操作数作为表达式的值,且不再执行第二个操作数。
js
0 ?? 100; // 0
false ?? 100; // false
null ?? 100; // 100
undefined ?? 100; // 100
案例
js
// 逻辑或运算符
console.log(100 || 'hello'); // 100
console.log(false || 'hello'); // hello
console.log(0 || 'hello'); // hello
console.log(undefined || 'hello'); // hello
console.log('');
console.log(100 ?? 'hello'); //100
console.log(0 ?? 'hello'); //0
console.log(false ?? 'hello'); //false
console.log(undefined ?? 'hello'); //hello
console.log(null ?? 'hello'); //hello
逻辑赋值运算符
逻辑与运算符组成的表达式的值:
a && b
js
如果第一个操作数成立,取第二个操作作为表达式的值
如果第一个操作数不成立,取第一个操作作为表达式的值,第二个操作不会被执行到
逻辑或运算符组成的表达式的值:
a || b
js
如果第一个操作数成立,取第一个操作数作为表达式的值,第二个操作数不会被执行到
如果第一个操作数不成立,取第二个操作数作为表达式的值
js
x &&= y; // 相当于 x = x && y;
x ||= y; // 相当于 x = x || y;
x ??= y; // 相当于 x = x ?? y;
js
let a1 = 10;
let a2 = 20;
let a3 = 30;
// &&=
a1 &&= 250; // a1 = a1 && 250; 或者 a1 && (a1 = 250)
// 100 &&= 200; // 100 = 100 && 200;
console.log(a1); //250
console.log('');
a2 ||= 250;
console.log(a2); //20
console.log('');
a3 ??= 250; // a3 = a3 ?? 250
console.log(a3); //30
console.log('');