2013-07-03 11 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

ObjectLiteral生産が解析される方法を定義ECMAScript section 11.1.5を参照してください。特に

PropertyNameAndValueListPropertyName次のようAssignmentExpression が評価される:

  1. はPropertyNameAndValueListを評価します。

  2. はPropertyName意味を評価します。

  3. はAssignmentExpressionを評価します。 (1)再帰的な定義である

...

これは、オブジェクトリテラルの左端の項目が最初に評価されます、そしてそう{foo: 2, bar: 1}が実際の仕様によって義務付けられていることを意味します。

+0

、明確かつ簡潔かつ実績のある+1 –

関連する問題