运算符优先级
/*
运算符优先级
优先级 运算类型 关联性 运算符
21 圆括号 n/a ()
20 成员访问 从左到右 XXX . XXX e.g. person.name
需计算的成员变量 从左到右 XXX [ XXX ]
new() n/a new XXX (XXX) e.g. new Person ('小明') || new Person()
函数调用 从左到右 XXX (XXX) e.g. getValue(name)
可选链 从左到右 ?. e.g. obj.first && obj.first.second = obj.frist?.second
19 new 从右到左 new XXX e.g. new Foo = new Foo
18 后置递增 n/a XXX ++ e.g. i++
后置递减 XXX -- e.g. i--
17 逻辑非 从右到左 !XXX e.g. !person.money
按位非 ~ XXX
一元加法 + XXX e.g. + 10
一元减法 - XXX e.g. - 10
前置递增 ++ XXX e.g. ++ i
前置递减 -- XXX e.g. -- i
typeof typeof XXX e.g. typeof Number
void void XXX
delete delete XXX e.g. delete person.money
await await XXX
16 幂 从右到左 XXX ** XXX
15 乘法 从左到右 XXX * XXX e.g. 3 * 5
除法 XXX / XXX e.g. 15 / 5
取余 XXX % XXX e.g. 3 % 5
14 加法 从左到右 XXX + XXX e.g. 1 + 1
减法 XXX - XXX e.g. 3 - 2
13 按位左移 从左到右 XXX << XXX
按位右移 XXX >> XXX
无符号右移 XXX >>> XXX
12 小于 从左到右 XXX < XXX e.g. 3 < 5
小于等于 XXX <= XXX e.g. 5 <= 5
大于 XXX > XXX e.g. 5 > 3
大于小于 XXX < XXX e.g. 3 < 5
in XXX in XXX e.g. money in person
instanceof XXX instanceof XXX e.g. arr instanceof Array
11 等于 从左到右 XXX == XXX
不等 XXX != XXX
全等 XXX === XXX
不全等 XXX !== XXX
10 按位与 从左到右 XXX & XXX
9 按位异或 从左到右 XXX ^ XXX
8 按位或 从左到右 XXX | XXX
7 逻辑与 从左到右 XXX && XXX
6 逻辑或 从左到右 XXX || XXX
5 空值合并 从左到右 XXX ?? XXX 当左侧为null 或 undefined时,返回右侧数据
4 三元运算符 从右到左 XXX ? XXX : XXX
3 赋值 从右到左 XXX = XXX
XXX += XXX e.g. x += y => x = x + y
XXX -= XXX e.g. x -= y => x = x - y
XXX **= XXX e.g. x **= y => x = x ** y
XXX *= XXX e.g. x *= y => x = x * y
XXX /= XXX e.g. x /= y => x = x / y
XXX %= XXX e.g. x %= y => x = x % y
XXX <<= XXX
XXX >>= XXX
XXX >>>= XXX
XXX &= XXX
XXX ^= XXX
XXX |= XXX
XXX &&= XXX
XXX ||= XXX
XXX ??= XXX
2 yield 从右到左 yield XXX
yield* yield* XXX
1 展开运算符 n/a ... XXX e.g. { ...values }
0 逗号 从左到右 XXX , XXX
* */
关联性
/*
关联性决定拥有相同优先级的运算符的执行顺序
- 左关联(从左到右): a OP b OP c => (a OP b) OP c
- 右关联(从右到左): a OP b OP c => a OP (b OP c)
a = b = 5 => b = 5 => a = (b = 5) 赋值运算符的返回结果就是赋值运算符右边的那个值
* */