在JavaScript中,运算符通常用于创建程序。
运算符具有特定的优先级和不同的计算顺序。
现在让我们谈谈运算符优先级。
运算符
运算符是用符号表示运算处理。
例如,像“5 + 3”这样的加法中使用的+也是运算符的一种。
let num = 5 + 3; // 加法运算
还有很多其他类型的运算符,你需要根据你想要做什么样的处理来正确使用它们。
下面是一个使用乘法运算符(*)执行乘法和除法运算符(/)执行除法的示例。
let num1 = 5 * 3; // 乘法运算 let num2 = 5 / 3; // 除法运算
运算符优先级
在JavaScript中,运算符的优先级是确定的,从优先级最高的一个开始进行算术处理。
当运算符具有不同的优先级时
请看下面使用+和*运算符的示例。
let num = 5 + 3 * 10;
如果先执行这两个+操作,结果将是:
let num = 5 + 3; let total = num * 10; console.log(total); // 80
相反,如果先进行*的运算会怎样呢?
let num = 3 * 10; let total = num + 5; console.log(total); // 35
可以看到,根据是先执行+还是先执行*运算,得到的结果会有所不同。
在这种情况下,运算符的优先级决定了运算的顺序。
乘法的计算优先级高于加法,因此将首先执行乘法,而不是按从左到右的顺序处理公式。
let num = 5 + 3 * 10; // 先计算3 * 10 console.log(num); // 35
当运算符具有相同的优先级时
请看使用/和*的算子的例子。
let num = 12 / 3 * 4;
如果先执行/运算,则结果如下所示。
let num = 12 / 3; let total = num * 4; console.log(total); // 16
相反,如果先执行*运算,则会得到这样的结果。
let num = 3 * 4; let total = num / 12; console.log(total); // 1
同样,根据您先执行的是/还是*运算,得到的结果也不同。
但是除法和乘法的优先级是一样的。
如果运算符具有相同的优先级,则根据运算符的连接性来确定运算的顺序。
除法和乘法的耦合性均为左耦合,因此首先计算除法。
let num = 12 / 3 * 4; // 和 (12 / 3) * 4; 是一样的 console.log(num); // 16
分组时
让我们看另一个例子。
以下结果首先执行除法,因为除法的优先级高于加法。
let num = 10 + 2 / 6; // 先计算 2 / 6 console.log(num); // 10.333333333333334
那么如果我们把加法用括号括起来会发生什么呢?
let num = (10 + 2) / 6; console.log(num); // 2
这也与运算符的优先级有关。
括号中的加法是处理括号的结果,因为括号的优先级较高。
()被称为分组运算符,因为它对括号中的内容进行分组。
在使用多个具有不同优先级的运算符时,通常会使用分组运算符。
运算符结合性
不同优先级的运算符在结合性方面没有什么特别的关系,因为优先级较高的运算符首先执行。
但是,如果存在多个具有相同优先级的运算符,则处理顺序取决于它们的结合性。
连接性分为从左到右结合的左结合和从右到左结合的右结合。
a + b - c; // 左结合 与 (a + b) - c; 相同 a = b = c; // 右结合 与 a = (b = c); 相同
它们中的大多数是左结合的,按从左到右的顺序进行计算。
下面列出了运算符的优先级和结合性。
从上到下排列优先级较高的。
优先级 | 结合性 | 运算符 | 类型 |
---|---|---|---|
19 | n/a | (…) | 分组 |
18 | 左 | … . … | 成员访问 |
– | 左 | …[…] | 成员访问 |
– | n/a | new…(…) | new(带参数列表) |
– | 左 | …(…) | 函数调用 |
– | 左 | ?. | 可选链(Optional chaining) |
17 | 右 | new… | new(无参数列表) |
16 | n/a | …++ | 后置递增 |
– | n/a | …– | 后置递减 |
15 | 右 | ! | 逻辑非 (!) |
– | 右 | ~ | 按位非 (~) |
– | 右 | + | 一元加法 (+) |
– | 右 | – | 一元减法 (-) |
– | 右 | ++… | 前置递增 |
– | 右 | –… | 前置递减 |
– | 右 | typeof… | typeof |
– | 右 | void… | void |
– | 右 | delete… | delete |
– | 右 | await… | await |
14 | 右 | …**… | 幂 (**) |
13 | 左 | …*… | 乘法 (*) |
– | 左 | …/… | 除法 (/) |
– | 左 | …%… | 取余 (%) |
12 | 左 | …+… | 加法 (+) |
– | 左 | …-… | 减法 (-) |
11 | 左 | …<<… | 按位左移 (<<)<> |
– | 左 | …>>… | 按位右移 (>>) |
– | 左 | …>>>… | 无符号右移 (>>>) |
10 | 左 | …<… | 小于 (<)<> |
– | 左 | …<=… | 小于等于 (<=)<> |
– | 左 | …>… | 大于 (>) |
– | 左 | …>=… | 大于等于 (>=) |
– | 左 | …in… | in |
– | 左 | …instanceof… | instanceof |
9 | 左 | …==… | 相等 (==) |
– | 左 | …!=… | 不相等 (!=) |
– | 左 | …===… | 一致/严格相等 (===) |
– | 左 | …!==… | 不一致/严格不相等 (!==) |
8 | 左 | …&… | 按位与 (&) |
7 | 左 | …^… | 按位异或 (^) |
6 | 左 | …|… | 按位或 (|) |
5 | 左 | …&&… | 逻辑与 (&&) |
4 | 左 | …||… | 逻辑或 (||) |
– | 左 | …??… | 空值合并 (??) |
3 | 右 | … ? … : … | 条件(三元)运算符 |
2 | 右 | …=… | 赋值 【※1】 |
1 | 左 | , | 逗号 / 序列 |
【※1】的赋值有很多种,因此省略了。
其他赋值运算符如下所示。
+=-=**=*=/=%=<<=>>=>>>=&=^=|=&&=||=??=
结语
在本文中我们学习了运算符的优先级。
在编写程序方面,后期还需要一些运算符的种类和使用知识,但在此,我们重点介绍了运算符是按照怎样的顺序进行处理的。
在JavaScript中,组合多个运算符进行处理的情况很多,根据运算处理的优先顺序不同,得到的结果也不同,所以了解这些结构是很重要的。