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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Webページ中の javascript をVB...
-
ローカルのレジストリを読みたい
-
〔Excel:VBA〕マクロの実行が異...
-
csvファイルを読み込み、該当項...
-
JavaScriptで ブラウザの閉じる...
-
ASP(VBS) ←→ JavaScript の変数...
-
VBScript から JavaScript を呼...
-
列を非表示にするマクロが実行...
-
VB.NET2003 テキストボックスに...
-
一定時間ごとの実行
-
PowerPointで時計表示
-
「戻る」ボタン使用時のフォー...
-
Ajaxが動きません~『status=0』?
-
PHPとJavaとC#の違い
-
Windows Form のMSChartで、グ...
-
confirm()をはい/いいえ に切...
-
javascriptで「オブジェクトを...
-
VB.netの重複データ数カウント...
-
JavaScriptでIEのウィンドウを...
-
if(1){...}とはどういうことで...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ローカルのレジストリを読みたい
-
Webページ中の javascript をVB...
-
Shell.ApplicationでのIEオブ...
-
エクセル2010のvbaについて
-
イベントevt?evt.target:event....
-
フォルダ内のファイル名を取得...
-
タブブラウザで focus() を実...
-
evtとは
-
event.srcElementの動的設定
-
jQuery for内にある配列の後の...
-
画面間でのJavaScrip...
-
チェックボックスを認識・不認...
-
JavaScriptで複数のプロパティ...
-
Dateオブジェクトの大小比較の...
-
for...inのプロパティ取り出し...
-
CSSのクラスを動的に変更 classで
-
javaScriptでグローバル変数に...
-
イベントリスナに登録される fu...
-
IEでDOMインターフェースを拡張...
-
文字を移動させその位置を表示...
おすすめ情報