JavaScript运算符的优先级

427 阅读3分钟

「这是我参与2022首次更文挑战的第19天,活动详情查看:2022首次更文挑战

Hope is a good thing, maybe the best of things. And no good thing ever dies—— 《The Shawshank Redemption》

前言

上一篇文章我回顾了一下JavaScript运算符,今天继续来看一下JavaScript运算符的优先级。

运算符的优先级决定了计算机运算计算表达式时执行运算的先后顺序。先执行具有较高优先级的运算,然后执行较低优先级的运算。比如我们常见的 a + b * c 乘法的优先级高于加法的优先级,结果就是先执行乘法在执行加法。

圆括号运算符

圆括号运算符 ( ) 用于控制表达式中的运算优先级。

使用 ( ) 可以提升我们的运算表达式的优先级,让其先执行。

1 + 2 * 3  // 7

(1 + 2) * 3 // 9

优先级说明

运算符说明结合性示例
[].()new .. (...)?.成员访问、数组索引、函数调用、表达式分组、带参new、可选链(Optional chaining)从左向右new Fn(param)a?.b.c
new ...无参数的new从右到左new Array()
… ++、… --后置递增、后置递减
!、~、+、-、++ …、-- …、typeof …、delete …、await …、void …[逻辑非 (!)]、[按位非 (~)]、[一元加法 (+)]、[一元减法 (-)]、[前置递增]、[前置递减]、 typeof、void、delete、await从右到左
**幂 (**)从右到左
* 、 / 、%乘法、除法、取余从左到右
+、-加法、减法从左到右
<<、>>、>>>左位移、右位移、无符号右移从左到右
<、<=、>、>=、instanceof、 in小于、小于或等于、大于、大于或等于、是否为特定类的实例(instanceof)、属性在指定的对象或其原型链中(in)从左到右
==、!=、===、!==相等、不相等、全等,不全等从左到右
&按位与 (&)从左到右
按位异或 (^)从左到右
|按位或 (|)从左到右
&&短路与(逻辑“与”)从左到右
||短路或(逻辑“或”)从左到右
??空值合并 (??)从左到右
… ? … : …三元运算符从右到左
=、+=、-=、*=、/=、%=、&=、|=、^=、<、<=、>、>=、>>=赋值从右到左
,多个序列计算(逗号)从左到右

结合性

运算符的结合性大部分都是【从左到右】的,只有一少部分是【从右到左】。

无论结合性和优先级如何,求值顺序总是从左到右

仅使用一个或多个不同优先级的运算符时,结合性不会影响输出。 当有多个具有相同优先级的运算符时,结合性的差异就会发挥作用。

举个例子: 下面的运算结果是相同的,因为加法是左结合,所结果是相同的。

6 / 3 / 2 ; // 1
(6 / 3) / 2 ; // 1

因为幂运算符是右结合,所下面结果是相同的

2 ** 3 ** 2; // 512
2 ** (3 ** 2); // 512

但是如果把括号运算放到前面的话,就改变了它的运算顺序。

(2 ** 3) ** 2; // 64

结语

如果这篇文章帮到了你,欢迎点赞👍和关注⭐️。

文章如有错误之处,希望在评论区指正🙏🙏

欢迎关注我的微信公众号,一起交流技术,微信搜索 🔍 :「 五十年以后