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)で出力されます。
どのプロパティから取り出されるか決まっていないのであれば
出力結果の順序がバラバラになるはずなのでは?
私が意味を取り違えているのでしょうか。
お詳しい方、どなたか理由を教えてください。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
ECMAScriptの仕様では定められていないということです。
しかし、長い歴史の中でデファクトスタンダードができて、各環境も大体それに添っています。
ただし、その通りでない(バラバラな順序で返す)環境があっても文句は言えないよということです。
ここで提案されているものがデファクトスタンダードです。
http://wiki.ecmascript.org/doku.php?id=strawman: …
要は、配列のインデックスとなる0から4294967295までの整数キーを先に数値順に列挙して、
その後は加えられた順に列挙するというものです。
ただし、まだ正式な仕様にはなっていませんし、現状各環境で微妙なズレがあるので、過信は禁物です。
もしも順序が保証されるテーブルが欲しい時はMapを使ってください。
http://people.mozilla.org/~jorendorff/es6-draft. …
こちらはキッチリ挿入順に列挙できます。
回答していただきありがとうございました!
大方の標準というものがありそれに沿っているが
絶対ではないのですね。
その標準を確認する術があることを知り勉強になりました。
No.2
- 回答日時:
ECMAScript 5 では for-in の順序に規定はありませんが、同じ環境(OS/ブラウザ/ブラウザバージョン等が一致)で for-in を実行すれば、同じ順序で出力されます。
しかしながら、ブラウザAとブラウザBでは別の順序で出力される可能性があります。
つまり、ECMAScript 5 を実装する全てのブラウザで同じ順序で出力される保証はありませんし、同じブラウザでもバージョンによって順序が異なるかもしれません。
どうしても、オブジェクトのkey順序を整列させたいのなら、Object.keys.sort() でソートすれば良いですが、それなら初めから配列で定義するほうが筋が良いと私は思います。
# Re: lade0225
No.1
- 回答日時:
>どのプロパティから取り出されるか決まっていないのであれば
>出力結果の順序がバラバラになるはずなのでは?
単純に取り出す順序は特定の手順を用いても常に一定を「保障されない」ということです。
「必ずしも同じではない」ということは、「必ずバラバラになる」と同意ではありません。
保障されていないものを個人の思い込みで、n番目に抽出されるデータの
プロパティがxだと、勝手に決め込んでコーディングをすると痛い目にあうよ
ということだけなので、どうしても順序が重要な場合は配列を使ったり、
ソート用のキーを用意するなど運用でカバーする必要があります
早速回答していただき、ありがとうございました。
>「必ずしも同じではない」ということは、「必ずバラバラになる」と同意ではありません。
「必ずバラバラになる」と勘違いしていましたが、正しく理解できました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・【お題】絵本のタイトル
- ・【大喜利】世界最古のコンビニについて知ってる事を教えてください【投稿~10/10(木)】
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・ハマっている「お菓子」を教えて!
- ・最近、いつ泣きましたか?
- ・夏が終わったと感じる瞬間って、どんな時?
- ・10秒目をつむったら…
- ・人生のプチ美学を教えてください!!
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
evtとは
-
文字を移動させその位置を表示...
-
Webページ中の javascript をVB...
-
「リンク」と「ハイパーリンク...
-
jsでルートディレクトリより上...
-
PHPができればJavaScriptは...
-
〔Excel:VBA〕マクロの実行が異...
-
ページ遷移時にアコーディオン...
-
JavaScriptで ブラウザの閉じる...
-
javascriptで「オブジェクトを...
-
PowerPointで時計表示
-
VBA ステータスバー DoEvents
-
VBScript から JavaScript を呼...
-
VBAによる第3、4水準文字の判定...
-
confirm()をはい/いいえ に切...
-
jQuery ui Datepicker 明日以降...
-
JavascriptでのExcel起動について
-
alert()が実行できない
-
if(1){...}とはどういうことで...
-
innerHTMLなどの反映タイミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ローカルのレジストリを読みたい
-
Webページ中の javascript をVB...
-
javaScriptでグローバル変数に...
-
javascript 名前空間?
-
エクセル2010のvbaについて
-
一定時間経つと画像を消す方法
-
ASP.NETでURLにマッピングされ...
-
evtとは
-
Javascriptの正規表現で変数を...
-
JavaScriptの正規表現について
-
Shell.ApplicationでのIEオブ...
-
タブブラウザで focus() を実...
-
JSの「document.getElementById...
-
javascriptでのリンク
-
画面間でのJavaScrip...
-
「リンク」と「ハイパーリンク...
-
【javascript】プロパティ?オ...
-
JavaScriptで複数のプロパティ...
-
フォルダ内のファイル名を取得...
-
javascript 親オブジェクトと子...
おすすめ情報