当前位置:  开发笔记 > 编程语言 > 正文

Javascript增量评估的操作顺序

如何解决《Javascript增量评估的操作顺序》经验,为你挑选了1个好方法。

我知道后缀/前缀增量/减量运算符的作用.在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在表达式中求值?



1> kay..:

看看:

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)

推荐阅读
郑小蒜9299_941611_G
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有