JS 运算符的优先级和结合性规定了它们在复杂的表达式中的运算顺序。
JS 运算符优先级
运算符的执行顺序称为运算符的优先级,优先级高的运算符先于优先级低的运算符执行运算。例如:
w=x+y*z;
执行加法运算的+
运算符的优先级低于*
运算符,所以y*z
将先被执行,乘法运算执行完后得到的结果再和 x 相加。
运算符的优先级可以通过使用圆括号来改变,例如为了让加法先执行,乘法后执行,可以修改上面的表达式为:
w=(x+y)*z;
这样就会先执行x+y
,得到和后再和 z 进行乘法运算。
JS 运算符结合性
对于相同优先级的运算符的执行顺序,则由运算符的结合性来决定。运算符的结合性包括「从右至左」和「从左至右」两种:
- 从右至左的结合性指的是,运算的执行是按从右到左的顺序进行;
- 从左至右的结合性刚好相反,运算符的执行顺序按照从左到右的顺序进行。
JS 运算符优先级和结合性一览表
下表中按照优先级由高到低的顺序罗列了 JavaScript 中的所有运算符:
优先级 | 运算符类型 | 结合性 | 运算符 | 高低 |
---|---|---|---|---|
21 | 圆括号 | n/a(不相关) | ( … ) | 高 ↑ | | | | | | | | | | | | | | | | | | 低 |
20 | 成员访问 | 从左到右 | … . … | |
需计算的成员访问 | 从左到右 | … [ … ] | ||
new(带参数列表) | n/a | new … ( … ) | ||
函数调用 | 从左到右 | … ( … ) | ||
可选链(Optional chaining) | 从左到右 | ?. | ||
19 | new(无参数列表) | 从右到左 | new … | |
18 | 后置递增 | n/a | … ++ | |
后置递减 | … — | |||
17 | 逻辑非 (!) | 从右到左 | ! … | |
按位非 (~) | ~ … | |||
一元加法 (+) | + … | |||
一元减法 (-) | – … | |||
前置递增 | ++ … | |||
前置递减 | — … | |||
typeof | typeof … | |||
void | void … | |||
delete | delete … | |||
await | await … | |||
16 | 幂 (**) | 从右到左 | … ** … | |
15 | 乘法 (*) | 从左到右 | … * … | |
除法 (/) | … / … | |||
取余 (%) | … % … | |||
14 | 加法 (+) | 从左到右 | … + … | |
减法 (-) | … – … | |||
13 | 按位左移 (<<) | 从左到右 | … << … | |
按位右移 (>>) | … >> … | |||
无符号右移 (>>>) | … >>> … | |||
12 | 小于 (<) | 从左到右 | … < … | |
小于等于 (<=) | … <= … | |||
大于 (>) | … > … | |||
大于等于 (>=) | … >= … | |||
in | … in … | |||
instanceof | … instanceof … | |||
11 | 相等 (==) | 从左到右 | … == … | |
不相等 (!=) | … != … | |||
全等 (===) | … === … | |||
不全等 (!==) | … !== … | |||
10 | 按位与 (&) | 从左到右 | … & … | |
9 | 按位异或 (^) | 从左到右 | … ^ … | |
8 | 按位或 (|) | 从左到右 | … | … | |
7 | 逻辑与 (&&) | 从左到右 | … && … | |
6 | 逻辑或 (||) | 从左到右 | … || … | |
5 | 空值合并 (??) | 从左到右 | … ?? … | |
4 | 条件(三元)运算符 | 从右到左 | … ? … : … | |
3 | 赋值 | 从右到左 | … = … | |
… += … | ||||
… -= … | ||||
… **= … | ||||
… *= … | ||||
… /= … | ||||
… %= … | ||||
… <<= … | ||||
… >>= … | ||||
… >>>= … | ||||
… &= … | ||||
… ^= … | ||||
… |= … | ||||
… &&= … | ||||
… ||= … | ||||
… ??= … | ||||
2 | yield | 从右到左 | yield … | |
yield* | yield* … | |||
1 | 逗号 / 序列 | 从左到右 | … , … |
说明:不同行的运算符, 从上往下,优先级由高到低依次排列。
【示例】JS 运算符的优先级和结合性示例。
- //根据默认的优先级和结合性先进行乘法运算,再取模,最后才进行加法运算
- var expr1 = 3 + 5 * 5 % 3;
- //使用()修改优先级,首先进行加法运算,然后按从左至右的结合性依次进行乘法和取模运算
- var expr2 = (3 + 5) * 5 % 3;
- //使用()修改优先级,使得加法和取模运算优先级相同且最高,首先进行加法和取模运算,最后再进行乘法运算
- var expr3 = (3 + 5) * (5 % 3);
- console.log(“expr1 = “ + expr1);
- console.log(“expr2 = “ + expr2);
- console.log(“expr3 = “ + expr3);
在 Chrome 开发者工具中运行代码,结果为:
expr1 = 4
expr2 = 1
expr3 = 16
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容