- ベストアンサー
for...inのプロパティ取り出し順序について
- Javascript初心者の方がfor...in文を使ってオブジェクトのプロパティを取り出す際、指定した順序で取り出されることがあるが、その理由について質問です。
- for...in文の注意点として、どの順序でプロパティが取り出されるかは決まっていないし、指定することもできないとされています。
- しかし、実際に試してみると、指定した順序(name、old、address、email)でプロパティが取り出されることがあります。これはどうしてでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ECMAScriptの仕様では定められていないということです。 しかし、長い歴史の中でデファクトスタンダードができて、各環境も大体それに添っています。 ただし、その通りでない(バラバラな順序で返す)環境があっても文句は言えないよということです。 ここで提案されているものがデファクトスタンダードです。 http://wiki.ecmascript.org/doku.php?id=strawman:enumeration 要は、配列のインデックスとなる0から4294967295までの整数キーを先に数値順に列挙して、 その後は加えられた順に列挙するというものです。 ただし、まだ正式な仕様にはなっていませんし、現状各環境で微妙なズレがあるので、過信は禁物です。 もしも順序が保証されるテーブルが欲しい時はMapを使ってください。 http://people.mozilla.org/~jorendorff/es6-draft.html#sec-map-constructor こちらはキッチリ挿入順に列挙できます。
その他の回答 (2)
- think49
- ベストアンサー率59% (285/482)
ECMAScript 5 では for-in の順序に規定はありませんが、同じ環境(OS/ブラウザ/ブラウザバージョン等が一致)で for-in を実行すれば、同じ順序で出力されます。 しかしながら、ブラウザAとブラウザBでは別の順序で出力される可能性があります。 つまり、ECMAScript 5 を実装する全てのブラウザで同じ順序で出力される保証はありませんし、同じブラウザでもバージョンによって順序が異なるかもしれません。 どうしても、オブジェクトのkey順序を整列させたいのなら、Object.keys.sort() でソートすれば良いですが、それなら初めから配列で定義するほうが筋が良いと私は思います。 # Re: lade0225
お礼
回答していただきありがとうございました! 環境による結果の違いが保障されないという事ですね。
- yambejp
- ベストアンサー率51% (3827/7415)
>どのプロパティから取り出されるか決まっていないのであれば >出力結果の順序がバラバラになるはずなのでは? 単純に取り出す順序は特定の手順を用いても常に一定を「保障されない」ということです。 「必ずしも同じではない」ということは、「必ずバラバラになる」と同意ではありません。 保障されていないものを個人の思い込みで、n番目に抽出されるデータの プロパティがxだと、勝手に決め込んでコーディングをすると痛い目にあうよ ということだけなので、どうしても順序が重要な場合は配列を使ったり、 ソート用のキーを用意するなど運用でカバーする必要があります
お礼
早速回答していただき、ありがとうございました。 >「必ずしも同じではない」ということは、「必ずバラバラになる」と同意ではありません。 「必ずバラバラになる」と勘違いしていましたが、正しく理解できました。
お礼
回答していただきありがとうございました! 大方の標準というものがありそれに沿っているが 絶対ではないのですね。 その標準を確認する術があることを知り勉強になりました。