我知道后缀/前缀增量/减量运算符的作用.在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
在表达式中求值?
看看:
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中,在右侧(RHS)完成任何操作之前,执行整个左侧(LHS)并记住值.
您可以通过阅读标准来确认评估顺序,或者只是在表达式中放置一个运行时错误,看看会发生什么:
alert(1) + alert(2) + (function () { throw Error(); })() + alert(3)