运算符
一元运算符如何改变值?
- 自增自减:
++x/--x先运算再返回,x++/x--先返回再运算;
let num1 = 29;
const num2 = --num1 + 2; // 30; num1 先减为 28
const num3 = num1-- + 2; // 30; 先用 28 参与运算, 之后 num1 变为 27
- 一元正负:
+x等价于Number(x),-x等价于-Number(x);
位运算符如何按位运算?
| 运算符 | 含义 | 说明 |
|---|---|---|
~ | 按位非 | 逐位取反 |
& | 按位与 | 两位都为 1 才为 1 |
| | 按位或 | 任一位为 1 即为 1 |
^ | 按位异或 | 两位不同才为 1 |
<< | 左移 | 保留符号位 |
>> | 右移 | 保留符号位 |
>>> | 无符号右移 | 不保留符号位, 负数结果差距大 |
算术运算符有哪些?
34 * 56; // 乘
66 / 11; // 除
26 % 5; // 取余
3 ** 2; // 幂, 等价于 Math.pow(3, 2)
1 + 2; // 加
2 - 1; // 减
关系与判等运算符有哪些?
| 运算符 | 机制 |
|---|---|
> >= | 左操作数大于/大于等于右操作数时返回 true |
< <= | 左操作数小于/小于等于右操作数时返回 true |
== != | 转换后比较, 相等/不等返回 true |
=== !== | 不转换, 值与类型同时相同/不同才返回 true |
逻辑运算符与空值合并如何选值?
| 运算符 | 机制 | 应用 |
|---|---|---|
!expr | 转布尔后取反 | !!x 等价于 Boolean(x) |
expr1 && expr2 | 若 expr1 为真返回 expr2, 否则返回 expr1 | 守卫式取值 |
expr1 || expr2 | 若 expr1 为假返回 expr2, 否则返回 expr1 | 兜底默认值 |
expr1 ?? expr2 | 返回第一个不是 null/undefined 的值 | 只兜底空值 |
- 短路:
false && anything不计算anything,true || anything同样短路; ||与??的差别:||会把false、0、""当成需要兜底的值,??只在空值时兜底;
const height = 0;
height || 100; // 100
height ?? 100; // 0
- 混用限制:
??不能与&&、||直接混写, 需要加括号;
条件、赋值与逗号运算符如何使用?
const result = condition ? trueValue : falseValue; // 条件运算符
let x = 1;
x += 2; // 等同于 x = x + 2
const num = (5, 1, 4, 8, 0); // 逗号运算符返回最后一个操作数的值
| 简写 | 含义 | 简写 | 含义 |
|---|---|---|---|
x += f | x = x + f | x <<= f | x = x << f |
x -= f | x = x - f | x >>= f | x = x >> f |
x *= f | x = x * f | x >>>= f | x = x >>> f |
x /= f | x = x / f | x **= f | x = x ** f |
x %= f | x = x % f |