Javascript增量评估的操作顺序

时间:2015-12-04 18:20:16

标签: javascript increment operator-precedence

我知道后缀/前缀增量/减量运算符的作用。在javascript中,这似乎没有什么不同。

虽然我可以轻松猜出这一行的结果:

var foo = 10; console.log(foo, ++foo, foo, foo++, foo); 
// output: 10 11 11 11 12

因为++运算符出现在单独的表达式中。

由于这些运算符出现在同一个表达式中,因此有点复杂:

var foo = 10; console.log(foo, ++foo + foo++, foo);
// output[1]: 10 22 12
// Nothing unexpected assuming LTR evaluation

var foo = 10; console.log(foo, foo++ + ++foo, foo);
// output[2]: 10 22 12
// What? Ordering is now different but we have the same output.
// Maybe value of foo is evaluated lazily...

var foo = 10; console.log(foo, foo + ++foo, foo);
// output[3]: 10 21 11
// What?! So first 'foo' is evaluated before the increment?

我的问题是,Javascript(在这种情况下是V8,我在Chrome中测试过这些)最终会以不同方式评估第2和第3个示例中的添加表达式吗?

为什么foo的评估结果与foo++不同。是不是postfix ++应该在表达式后递增,只是在表达式中求值为foo

3 个答案:

答案 0 :(得分:7)

请看:

foo++ + ++foo

将它改写为:

foo++ →
    addition_lhs = foo  // addition_lhs == 10
    foo += 1            // foo == 11
++foo →
    foo += 1            // foo == 12
    addition_rhs = foo  // addition_rhs == 12

addition_lhs + addition_rhs == 10 + 12 == 22

foo + ++foo

foo →
    addition_lhs = foo  // addition_lhs == 10
++foo →
    foo += 1            // foo == 11
    addition_rhs = foo  // addition_rhs == 11

addition_lhs + addition_rhs == 10 + 11 == 21

所以从左到右评估所有内容,包括增量。

要理解的关键规则是在JavaScript中执行整个左侧(LHS),并在右侧(RHS)完成任何操作之前记住值。 / p>

您可以按reading the standard确认评估顺序,也可以在表达式中放置运行时错误,看看会发生什么:

alert(1) + alert(2) + (function () { throw Error(); })() + alert(3)

答案 1 :(得分:2)

了解当你使用foo++时,你要告诉#34;编译器":在你将它推入堆栈后,增加它。当你使用++foo时,你会告诉另一种方法:增加它然后将其推送到堆栈。 ++运算符优先于+,因为"编译器"以这种方式阅读表达式(foo++)+(++foo)

答案 2 :(得分:1)

  

var foo = 10; console.log(foo,++ foo + foo ++,foo);

++foo + foo++
   11 + 11

pre增量将foo设置为11,然后将其再次添加到foo,仍为11,在foo再次递增之前计算为22。

  

var foo = 10; console.log(foo,foo ++ + ++ foo,foo);

foo++ + ++foo
10    +    12

当我们达到++ foo时,该值已经从foo ++

中归咎于
  

var foo = 10; console.log(foo,foo + ++ foo,foo);

foo + ++foo
10  +   11
在我们将它添加到foo之前,

foo会递增,从而给我们10 + 11

<强>概要

基本上一切都取决于你将它们加在一起时foo的当前值是什么。