簡體   English   中英

Javascript增量評估的操作順序

[英]Javascript increment operation order of evaluation

我知道后綴/前綴增量/減量運算符的作用。 在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中測試過這些)最終會不同地評估第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)

理解當你使用foo++你告訴“編譯器”:在你將它推入堆棧之后,增加它。 當你使用++foo你會說另一種方式:增加它然后將其推送到堆棧。 ++運算符優先於+ ,因為“編譯器”以這種方式讀取表達式(foo++)+(++foo)

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

++foo + foo++
   11 + 11

預增量將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的當前值是什么。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM