我知道后缀/前缀增量/减量运算符的作用。在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
?
答案 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的当前值是什么。