2013-07-03 65 views
7

如果我寫Javascript對象的初始化和計算順序

var a = [1,2]; 
var b = { 
    foo: a.pop(), 
    bar: a.pop() 
}; 

什麼是b值,根據規範?

(通過實驗,它的{foo: 2, bar: 1},但我擔心這是否是實現特定的。)

+0

爲什麼它是實現特定的? 'pop'突變原始數組。 – elclanrs

+1

@elclanrs,我認爲問題的關鍵是對象'b'屬性的值是否總是按它們在代碼中列出的順序進行評估。 –

+0

哦,我明白了......現在這實際上是一個很好的問題,但是雖然對象中屬性的順序很微不足道,但評估順序並不是這樣,所以我認爲這不是問題,但我可能是錯的。 .. – elclanrs

回答

1

他們在他們的排列順序進行評估。

9

請參閱ECMAScript section 11.1.5定義如何解析生產ObjectLiteral

特別是:

PropertyNameAndValueListPropertyNameAssignmentExpression 如下評價:

  1. 評估PropertyNameAndValueList。

  2. 評估PropertyName。

  3. 評估AssignmentExpression。

...

其中(1)是一個遞歸定義。

這意味着對象文字中最左邊的項目將首先被評估,因此{foo: 2, bar: 1}確實是規範的。

+0

清晰,簡潔並經過驗證的+1 –