JavaScript中的后缀和前缀增量/减少优先级



我已经编码多年了,突然陷入了有关运算符优先级的一些简单的事情。

根据https://developer.mozilla.org/en-us/docs/web/javascript/reference/poerators/operator/operator_precedence postfix 增量/减少的优先级高于 prefix 一个。所以,我希望在表达中

x = --a  + a++;  

增量将首先和之后才能计算出降低。但是,在测试中,此表达式计算从左到右,就像操作员具有相同的优先级。结果 a=1;x = --a + a++等于0而不是2。

好的。假设前缀/后缀操作员具有相同的优先级,我尝试用括号重新排序:

a=1;x = --a  + ( a++ )

,但再次,结果将为0,而不是我预期的2。

有人可以解释一下吗?为什么这里的括号不会影响任何东西?我怎么能看到后缀比前缀更高?

在表达式中,评估进行这样的进行:

    评估
  1. --a。变量a被减少,因此--a的值为0
  2. 评估
  3. a++。获得a的值,然后然后 a会增加。因此,a++的值为0
  4. 执行+操作,结果是0
  5. a的最终值是1

因为--aa++位于较低表格的+操作员的两侧,因此提出前和收入后的优先级差异无关紧要;+操作员在评估右手子表达之前评估左侧的子表达。

操作员优先级与评估顺序不同。

操作员的优先级告诉您

f() + g() * h()

被解析为

f() + (g() * h())

(因为*具有比+更高的优先级(,但没有首先称为哪个函数。这是由评估顺序控制的,在JavaScript中始终是从左到右的。

括号仅覆盖优先级(即它们会影响子表达的分组方式(,而不是评估顺序:

(f() + g()) * h()

在乘法之前执行添加,但是在所有情况下f均为首先称为h

在您的示例中

--a + a++

前缀--和Postfix ++的相对优先级并不重要,因为它们没有附加到同一操作数上。Infix +的优先级要低得多,因此该表达式解析为

(--a) + (a++)

与往常一样,从左到右评估JS表达式,因此--a首先完成。

如果您已经写了

--a++

本来可以解析为

--(a++)

(而不是(--a)++(,因为后缀++具有更高的优先级,但是差异在这里无关紧要,因为这两个版本都是错误的:您不能增加/减少另一个增量/减少操作的结果。

但是,在操作员优先表中,您可以看到所有前缀操作员都具有相同的优先级,因此我们可以显示一个替代方案:

// ! has the same precedence as prefix ++
!a++

是有效的代码,因为由于后缀++具有比!更高的优先级,因此将其解析为!(a++)。如果没有,它将被解释为(!a)++,这是一个错误。

好吧,这很奇怪,但是看起来像函数调用之类的表达式中的增量/降低表现不像运算符。我找不到有关表达式评估顺序评估的任何文档,但看起来它忽略了任何优先规则。如此奇怪的表达:

console.log(1) +  console.log(2)* ( console.log(3)  + console.log(4))

将在控制台中显示1234。我能找到唯一的解释,为什么括号不会影响表达式中DEC/INC的评估顺序

最新更新