一文读懂JavaScript运算符优先级

在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

一文读懂JavaScript运算符优先级

分组时

让我们看另一个例子。

以下结果首先执行除法,因为除法的优先级高于加法。

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); 相同

它们中的大多数是左结合的,按从左到右的顺序进行计算。

下面列出了运算符的优先级和结合性。

从上到下排列优先级较高的。

优先级结合性运算符类型
19n/a(…)分组
18… . …成员访问
…[…]成员访问
n/anew…(…)new(带参数列表)
…(…)函数调用
?.可选链(Optional chaining)
17new…new(无参数列表)
16n/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中,组合多个运算符进行处理的情况很多,根据运算处理的优先顺序不同,得到的结果也不同,所以了解这些结构是很重要的。