在 JavaScript 中,运算符的优先级和关联性是非常重要的概念。它们决定了表达式的计算顺序,从而影响程序的正确性和性能。在 ES11 中,新增了一些运算符,例如可选链和空值合并运算符,它们的优先级和关联性也有所不同。本文将详细介绍 ES11 中运算符的优先级和关联性,并提供一些使用圆括号的指导意义和示例代码。
运算符优先级
在 JavaScript 中,运算符的优先级是指它们在表达式中的计算顺序。例如,乘法运算符的优先级高于加法运算符,因此表达式 1 + 2 * 3
的计算顺序是先计算 2 * 3
,再加上 1
,结果为 7
。ES11 中新增的运算符如下表所示,优先级从高到低排列。
运算符 | 描述 | 关联性 |
---|---|---|
() |
圆括号 | 从左到右 |
new 、super 、. 、[] 、() 、?. 、new.target |
成员访问、函数调用、可选链、new.target |
从左到右 |
++ 、-- |
前置和后置自增自减 | 从右到左 |
! 、~ 、+ 、- 、typeof 、void 、delete |
一元运算符 | 从右到左 |
** |
指数运算符 | 从右到左 |
* 、/ 、% |
乘法、除法、取余 | 从左到右 |
+ 、- |
加法、减法 | 从左到右 |
<< 、>> 、>>> |
位运算 | 从左到右 |
< 、<= 、> 、>= 、in 、instanceof |
比较运算符、in 运算符、instanceof 运算符 |
从左到右 |
== 、!= 、=== 、!== |
相等运算符 | 从左到右 |
& |
按位与 | 从左到右 |
^ |
按位异或 | 从左到右 |
` | ` | 按位或 |
&& |
逻辑与 | 从左到右 |
` | ` | |
?? |
空值合并运算符 | 从左到右 |
? : |
条件运算符 | 从右到左 |
yield 、yield* 、async 、await |
生成器和异步函数的运算符 | 从右到左 |
从表中可以看出,圆括号的优先级最高,因此在表达式中使用圆括号可以改变计算顺序。例如,表达式 (1 + 2) * 3
的计算顺序是先计算 (1 + 2)
,再乘上 3
,结果为 9
。在使用圆括号时,需要注意它们的数量和位置,以确保表达式的正确性。
运算符关联性
在 JavaScript 中,运算符的关联性是指它们在表达式中的结合方式。例如,加法运算符的关联性为从左到右,因此表达式 1 + 2 + 3
的计算顺序是先计算 1 + 2
,再加上 3
,结果为 6
。ES11 中新增的运算符的关联性如下表所示。
运算符 | 描述 | 关联性 |
---|---|---|
() |
圆括号 | 从左到右 |
new 、super 、. 、[] 、() 、?. 、new.target |
成员访问、函数调用、可选链、new.target |
从左到右 |
++ 、-- |
前置和后置自增自减 | 从右到左 |
! 、~ 、+ 、- 、typeof 、void 、delete |
一元运算符 | 从右到左 |
** |
指数运算符 | 从右到左 |
* 、/ 、% |
乘法、除法、取余 | 从左到右 |
+ 、- |
加法、减法 | 从左到右 |
<< 、>> 、>>> |
位运算 | 从左到右 |
< 、<= 、> 、>= 、in 、instanceof |
比较运算符、in 运算符、instanceof 运算符 |
从左到右 |
== 、!= 、=== 、!== |
相等运算符 | 从左到右 |
& |
按位与 | 从左到右 |
^ |
按位异或 | 从左到右 |
` | ` | 按位或 |
&& |
逻辑与 | 从左到右 |
` | ` | |
?? |
空值合并运算符 | 从左到右 |
? : |
条件运算符 | 从右到左 |
yield 、yield* 、async 、await |
生成器和异步函数的运算符 | 从右到左 |
从表中可以看出,大多数运算符的关联性都是从左到右。这意味着,当表达式中有多个相同优先级的运算符时,它们将按照从左到右的顺序计算。例如,表达式 1 + 2 + 3
的计算顺序是先计算 1 + 2
,再加上 3
,结果为 6
。在使用多个相同优先级的运算符时,需要注意它们的顺序,以确保表达式的正确性。
使用圆括号的指导意义
在 JavaScript 中,使用圆括号可以改变运算符的优先级和关联性,从而影响表达式的计算顺序。为了提高代码的可读性和正确性,我们应该根据需要使用圆括号。以下是一些使用圆括号的指导意义。
1. 改变优先级
当表达式中有多个运算符时,可以使用圆括号改变它们的优先级。例如,表达式 (1 + 2) * 3
的计算顺序是先计算 (1 + 2)
,再乘上 3
,结果为 9
。如果没有使用圆括号,表达式 1 + 2 * 3
的计算顺序是先计算 2 * 3
,再加上 1
,结果为 7
。
2. 明确关联性
当表达式中有多个相同优先级的运算符时,可以使用圆括号明确它们的关联性。例如,表达式 1 + 2 + 3
的计算顺序是先计算 1 + 2
,再加上 3
,结果为 6
。如果没有使用圆括号,表达式 1 + (2 + 3)
的计算顺序是先计算 2 + 3
,再加上 1
,结果也为 6
。
3. 提高可读性
使用圆括号可以提高代码的可读性,使表达式更加清晰。例如,表达式 a + b * c
可以写成 (a + b) * c
,这样更容易理解它的含义。
4. 避免错误
使用圆括号可以避免一些常见的错误,例如忘记运算符的优先级或关联性。例如,表达式 a + b * c
可能会被误写成 a * b + c
,这样会产生错误的结果。
示例代码
以下是一些使用圆括号的示例代码,它们演示了如何改变运算符的优先级和关联性。
1. 改变优先级
// 使用圆括号改变乘法运算符的优先级 const result = (1 + 2) * 3; // 9
2. 明确关联性
// 使用圆括号明确加法运算符的关联性 const result1 = 1 + 2 + 3; // 6 const result2 = 1 + (2 + 3); // 6
3. 提高可读性
// 使用圆括号提高代码可读性 const result = (a + b) * c;
4. 避免错误
// 使用圆括号避免错误 const result1 = a + b * c; // 错误的结果 const result2 = (a + b) * c; // 正确的结果
结论
在 ES11 中,运算符的优先级和关联性决定了表达式的计算顺序。使用圆括号可以改变运算符的优先级和关联性,从而影响表达式的计算顺序。为了提高代码的可读性和正确性,我们应该根据需要使用圆括号,避免常见的错误。希望本文能够帮助读者更好地理解 ES11 中运算符的优先级和关联性,提高 JavaScript 编程能力。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675aa9d64b9d41201aba4918