2008/4/26 土曜日

【JS VS. AS】昇順が降順になる件。(for…inだから?)

Filed under: ActionScript,Flash — renji @ 13:50:20

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で

0.jpg
1
2

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

ABC

と出力される。とても自然。昇順で並ぶ。当たり前。

で、なんか出来心で「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);

でパブリッシュ!

ん?

結果はこちら。

outputpanel

あら??

添字の並びが降順になっている。。。

なんで?

怪しいところと言えば。。。for…inのとこくらいだけど。。。

昇順が降順になるって気持ち悪い。
ストレス解消のつもりが余計にストレス溜まるというオチ。
ものの30分ほどで。。。眠りにつきました。

で、職場の人と話をしていて、またいろいろ「?」になったのであとで調べる系。(←ほんとにやれよ自分)

2件のコメント »

  1. ・for in(AS3)
    オブジェクトのプロパティは特定の順序で保持されないため、プロパティは外見上ランダムな順序で表示されます。

    ECMAScriptの仕様上for inはプロパティを列挙順序を保証するモノでは無いのでしょうね。

    コメント by QURAGE — 2008/4/26 土曜日 @ 14:14:58

  2. こんにちは。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

この投稿へのコメントの RSS フィード。 TrackBack URL

コメントする



HTML convert time: 0.317 sec. Powered by WordPress ME