プロが教える店舗&オフィスのセキュリティ対策術

Javascriptを勉強中の初心者です。
以下はfor...in文を使ってオブジェクトに含まれるプロパティを
順に取り出して出力するスクリプトです。


var personal = {
name:'山田',
old:20,
address:'北海道',
email:'yamada@example.com'
}

document.write("<p>");

for(var pname in personal){
document.write(pname + " : " + personal[pname] + "<br />");
}

document.write("</p>");


参考書には、for...in文の注意点として
『どのような順序でプロパティが取り出されるか
決まっていないし指定もできない』と書いてありました。
しかし何度実行してもオブジェクト personal で
指定したどおりの順序(name、old、address、email)で出力されます。

どのプロパティから取り出されるか決まっていないのであれば
出力結果の順序がバラバラになるはずなのでは?

私が意味を取り違えているのでしょうか。
お詳しい方、どなたか理由を教えてください。
よろしくお願いします。

A 回答 (3件)

ECMAScriptの仕様では定められていないということです。


しかし、長い歴史の中でデファクトスタンダードができて、各環境も大体それに添っています。
ただし、その通りでない(バラバラな順序で返す)環境があっても文句は言えないよということです。

ここで提案されているものがデファクトスタンダードです。
http://wiki.ecmascript.org/doku.php?id=strawman: …
要は、配列のインデックスとなる0から4294967295までの整数キーを先に数値順に列挙して、
その後は加えられた順に列挙するというものです。

ただし、まだ正式な仕様にはなっていませんし、現状各環境で微妙なズレがあるので、過信は禁物です。
もしも順序が保証されるテーブルが欲しい時はMapを使ってください。
http://people.mozilla.org/~jorendorff/es6-draft. …
こちらはキッチリ挿入順に列挙できます。
    • good
    • 0
この回答へのお礼

回答していただきありがとうございました!

大方の標準というものがありそれに沿っているが
絶対ではないのですね。
その標準を確認する術があることを知り勉強になりました。

お礼日時:2014/06/12 11:56

ECMAScript 5 では for-in の順序に規定はありませんが、同じ環境(OS/ブラウザ/ブラウザバージョン等が一致)で for-in を実行すれば、同じ順序で出力されます。


しかしながら、ブラウザAとブラウザBでは別の順序で出力される可能性があります。
つまり、ECMAScript 5 を実装する全てのブラウザで同じ順序で出力される保証はありませんし、同じブラウザでもバージョンによって順序が異なるかもしれません。

どうしても、オブジェクトのkey順序を整列させたいのなら、Object.keys.sort() でソートすれば良いですが、それなら初めから配列で定義するほうが筋が良いと私は思います。

# Re: lade0225
    • good
    • 0
この回答へのお礼

回答していただきありがとうございました!
環境による結果の違いが保障されないという事ですね。

お礼日時:2014/06/12 11:49

>どのプロパティから取り出されるか決まっていないのであれば


>出力結果の順序がバラバラになるはずなのでは?

単純に取り出す順序は特定の手順を用いても常に一定を「保障されない」ということです。
「必ずしも同じではない」ということは、「必ずバラバラになる」と同意ではありません。

保障されていないものを個人の思い込みで、n番目に抽出されるデータの
プロパティがxだと、勝手に決め込んでコーディングをすると痛い目にあうよ
ということだけなので、どうしても順序が重要な場合は配列を使ったり、
ソート用のキーを用意するなど運用でカバーする必要があります
    • good
    • 0
この回答へのお礼

早速回答していただき、ありがとうございました。

>「必ずしも同じではない」ということは、「必ずバラバラになる」と同意ではありません。

「必ずバラバラになる」と勘違いしていましたが、正しく理解できました。

お礼日時:2014/06/12 11:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!