「for (… in …)」ループ内の要素の順序 質問する

「for (… in …)」ループ内の要素の順序 質問する

Javascript の「for…in」ループは、ハッシュテーブル/要素を宣言された順序でループしますか? 順序どおりに実行しないブラウザはありますか?
使用したいオブジェクトは一度宣言され、変更されることはありません。

以下のものがあるとします:

var myObject = { A: "Hello", B: "World" };

さらに、私はそれらを次のように使用します。

for (var item in myObject) alert(item + " : " + myObject[item]);

ほとんどの適切なブラウザでは、「A : "Hello"」が常に「B : "World"」の前に来ると期待できますか?

ベストアンサー1

ジョン・レシグの言葉を引用します:

現在、すべての主要ブラウザは、オブジェクトのプロパティを定義された順序でループします。Chrome も、いくつかの例外を除いて、これと同じことを行います。[...] この動作は、ECMAScript 仕様では明示的に未定義のままになっています。ECMA-262 のセクション 12.6.4 では、次のようになっています。

プロパティを列挙する仕組みは実装に依存します。

ただし、仕様は実装とはまったく異なります。ECMAScript の最新の実装はすべて、定義された順序でオブジェクト プロパティを反復処理します。このため、Chrome チームはこれをバグと見なし、修正する予定です。

すべてのブラウザは定義順序を尊重しますが、Chrome と Opera は例外で、数値以外のプロパティ名はすべて定義順序を尊重します。これら 2 つのブラウザでは、プロパティは最初の数値以外のプロパティの前に順番に取得されます (これは、配列の実装方法に関係しています)。順序も同様ですObject.keys

次の例を見れば何が起こるかは明らかでしょう:

var obj = {
  "first":"first",
  "2":"2",
  "34":"34",
  "1":"1",
  "second":"second"
};
for (var i in obj) { console.log(i); };
// Order listed:
// "1"
// "2"
// "34"
// "first"
// "second"

この技術的な詳細は、いつでも変更される可能性があるという事実ほど重要ではありません。このままの状態が続くことを期待しないでください。

つまり、順序が重要な場合は配列を使用します。

おすすめ記事