运算符优先级

运算符优先级javascript

发布于 2021

运算符的优先级决定了表达式中运算执行的先后顺序。

结合性

考虑下面的表示法描述的表达式:

a OP1 b OP2 c

左结合(左到右)相当于把左边的子表达式加上小括号 (a OP b) OP c,右结合(右到左)相当于 a OP (b OP c)。赋值运算符是右结合的,所以你可以这么写:

a = b = 5; // 相当于 a = (b = 5);

只有幂运算符是右结合的,而其他算术运算符都是左结合的。无论结合性和优先级如何,求值顺序总是从左到右。当有多个具有相同优先级的运算符时,结合性的差异就会发挥作用。判断执行顺序的时候,优先级在结合性之前。

6 / 3 / 2(6 / 3) / 2 是相同的,因为除法是左结合的。而幂运算符是右结合的,所以 2 ** 3 ** 22 ** (3 ** 2) 是相同的。

2 ** 3 / 3 ** 2 的结果是 0.8888888888888888,因为它相当于 (2 ** 3) / (3 ** 2)。

分组和短路

分组(Grouping)具有最高优先级。然而,这并不意味着总是优先对分组符号 ( … ) 内的表达式进行求值,尤其是涉及短路时。

在表达式 a && (b + c) 中,如果 a 为虚值(falsy),那么即使 (b + c) 在圆括号中,也不会被求值。

a ?? (b || c) 首先对 a 求值,如果 a 不是 nullundefined 则直接返回 a

优先级汇总表

优先级运算符类型结合性运算符
21分组(…)
20成员访问从左到右. / [] / ?.
20new (带参数列表)new … ( … )
20函数调用从左到右… ( … )
19new (无参数列表)从右到左new …
18后置递增/递减… ++ / …--
17逻辑非 (!)从右到左! …
17按位非 (~)从右到左~ …
17一元加法 (+)从右到左+ …
17一元减法 (-)从右到左- …
17前置递增从右到左++ …
17前置递减从右到左-- …
17typeof从右到左typeof …
17void从右到左void …
17delete从右到左delete …
17await从右到左await …
16幂 (**)从右到左… ** …
15乘法 (*) 除法 (/) 取余 (%)从左到右… * … … / … … % …
14加法 (+) 减法 (-)从左到右… + … … - …
13按位左移 (<<) 按位右移 (>>) 无符号右移 (>>>)从左到右… << … … >> … … >>> …
12小于 (<) 小于等于 (<=) 大于 (>) 大于等于 (>=) in instanceof从左到右… < … … <= … … > … … >= … … in … … instanceof …
11相等 (==) 不相等 (!=) 一致/严格相等 (===) 不一致/严格不相等 (!==)从左到右… == … … != … … === … … !== …
10按位与 (&)从左到右… & …
9按位异或 (^)从左到右… ^ …
8按位或 ( | )从左到右… | …
7逻辑与 (&&)从左到右… && …
6逻辑或 (||)从左到右… || …
5空值合并 (??)从左到右… ?? …
4条件(三元)运算符从右到左… ? … : …
3赋值从右到左… = … … += … … -= … … *_= … … _= … … /= … … %= … … <<= … … >>= … … >>>= … … &= … … ^= … … | = … … &&= … … | | = … … ??= …
2yield yield*从右到左yield … yield* …
1逗号 / 序列从左到右… , …

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Operators/Operator_Precedence