【JS VS. AS】昇順が降順になる件。(for…inだから?)
Cで配列を作ると「連続したメモリ空間」で、JavaScript配列は「ハッシュ・テーブル」で「値とキーのテーブル」みたいなことを知って「!」なって、久しぶりにjsをちょこちょこ弄ってみる。。。
//配列test_arrをnewする。
test_arr = new Array();//配列test_arrを文字A、B、Cそれぞれを入れる。
test_arr = ["A","B","C"];var str=”";
//fon…inで配列test_arrの添字を抜いてく。
for(var indexNum in test_arr){
//添字をループ毎に出力
alert(indexNum);
//配列test_arrの値と改行文字を変数strに溜めていく。
str += test_arr[indexNum];
str += “\n”;
}
//for…inのループでstrに溜めた値を出力。
//A 改行 B 改行 C 改行と出力される。
alert(str);
当たり前なんですが、実行結果は、
for…inのループごとにalertで



都度、「添字」が出力されて、
最後にfor…inで配列の値を溜めたstrの値がAlertに

と出力される。とても自然。昇順で並ぶ。当たり前。
で、なんか出来心で「JSもASもECMAScriptなんだから。」ってことで同じソースをFlashでも実行してみる。alert()メソッドはFlashには無いので、そこだけtrace()メソッドに変えてみる。ASのソースはこちら。
//配列test_arrをnewする。
test_arr = new Array();//配列test_arrを文字A、B、Cそれぞれを入れる。
test_arr = ["A","B","C"];var str=”";
//fon…inで配列test_arrの添字を抜いてく。
for(var indexNum in test_arr){
//添字をループ毎に出力
trace(indexNum);
//配列test_arrの値と改行文字を変数strに溜めていく。
str += test_arr[indexNum];
str += “\n”;
}
//for…inのループでstrに溜めた値を出力。
//A 改行 B 改行 C 改行と出力される。
trace(str);
でパブリッシュ!
ん?
結果はこちら。

あら??
添字の並びが降順になっている。。。
なんで?
怪しいところと言えば。。。for…inのとこくらいだけど。。。
昇順が降順になるって気持ち悪い。
ストレス解消のつもりが余計にストレス溜まるというオチ。
ものの30分ほどで。。。眠りにつきました。
で、職場の人と話をしていて、またいろいろ「?」になったのであとで調べる系。(←ほんとにやれよ自分)
TrackBack URL :
Comments (2)
・for in(AS3)
オブジェクトのプロパティは特定の順序で保持されないため、プロパティは外見上ランダムな順序で表示されます。
ECMAScriptの仕様上for inはプロパティを列挙順序を保証するモノでは無いのでしょうね。
コメント by QURAGE — 2008/4/26 土曜日 @ 14:14:58
こんにちは。QURAGEさん。
VersionPublisherにはいつもお世話になっております。m(_ _)m
はい本題。^^
>ECMAScriptの仕様上for inはプロパティを列挙順序を保証するモノ
>では無いのでしょうね。
やっぱりそういうものなんですね。
野中文雄氏の
http://www.fumiononaka.com/TechNotes/Flash/FN0110003.html
こことかでも言及されてますね。
自身のエントリで「後で調べる」と書いたのは、「列挙順序が保証されない」というなら、あるタイミングでは「ランダム」に並んだりするのかな?と疑問が湧いておりました。
コメントありがとうございます。(o^ー’)b
コメント by renji — 2008/4/26 土曜日 @ 14:33:09