2009-03-15 4 views
16

、次のコードがある場合:ジャバスクリプトオブジェクトのフィールドの順序は、それらをループするときに予測可能ですか? PHPで

$map = array(
    "first" => 1, 
    "second" => 2 
); 

$map["third"] = 3; 

foreach($map as $key => $value) { 
    // code 
} 

をあなたはエントリは、彼らが配列に追加された順に表示されます知っています。

ここで、以下の同等のJavaScriptに同じルールが適用されるとしますか?

map = { 
    "first": 1, 
    "second": 2 
}; 

map["third"] = 3; 

for (key in map) { 
    // code 
} 

これはの複製である:いいえ、動作は実装に依存し、それは保証されませんElements order - for (… in …) loop in javascript

+0

[Elements order for - (... in ...)ループのjavascriptで可能な複製](http://stackoverflow.com/questions/280713/elements-order-for-in-loop-in-javascript) ) – Borgar

答えて

10

ほとんどのブラウザは、オブジェクトに追加された順序でプロパティをループしますが、Javascript標準ではその順序は定義されていないと言われています。この動作に頼るべきではありません。たとえば、私はblog postを読んでいますが、Google Chromeがこのような動作を常に発揮するとは限りませんでした。

注文した機能が必要な場合は、オブジェクトキーまたは数値キーの両方を使用できる新しいクラスを自分で作成する必要があります。

+1

ありがとうございました。 Johnが言っていることは、標準ではないが、ブラウザのベンダーがそれをそのまま適用することである(つまり、Chromeチームは「バグ」を修正するだろう)。 –

+1

私はまだあなたがその行動に頼るべきだとは思わないが。あなた自身で動作を定義できるカスタムクラスを作成するだけで安全です。 –

0

。オーダーを保存する必要がある場合は、配列を使用します。

+1

はい(しかし標準): "プロパティを列挙するメカニズム(最初のアルゴリズムのステップ5、2番目のステップ6)は実装に依存します。列挙の順序はオブジェクトによって定義されます。 列挙自体は実装に依存しますが、順序はオブジェクトに依存しますか? –

+1

@Julian:ECMA-262の次のエディション3.1はあまりあいまいではありません: "プロパティ[...]を列挙する仕組みと順序は指定されていません。" – Christoph

関連する問題