[英]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.