Javascript 递增运算求值顺序

2024-04-27

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

虽然我可以很容易地猜出这一行的结果:

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

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

它变得有点复杂,因为这些运算符出现在同一个表达式中:

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 中测试了这些)最终如何以不同的方式评估第二个和第三个示例中的加法表达式?

为什么foo最终的评估与foo++。不是后缀吗++应该在表达式之后递增并计算为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

And 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 中whole在右侧 (RHS) 完成任何操作之前,执行左侧 (LHS) 并存储该值。

您可以通过以下方式确认评估顺序阅读标准 http://www.ecma-international.org/ecma-262/6.0/index.html#sec-addition-operator-plus或者只是在表达式中放置一个运行时错误,然后看看会发生什么:

alert(1) + alert(2) + (function () { throw Error(); })() + alert(3)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 递增运算求值顺序 的相关文章