Home > ActionScript > 配列を for .. in でまわすワナ

配列を for .. in でまわすワナ

var test = [ "a","b","c" ];
for (var i in test){
    trace(test[i] + " : " + i);
}

[実行結果]
c : 2
b : 1
a : 0

↑配列をループ処理させたつもりが、よく見ると配列の要素が降順 で処理されています。

ActionScript1.0/ActionScript2.0 どちらも同じ挙動でした。Macromedia Exchange にて入手したスクリプトの動作確認していたところ、たまたま発見。Exchangeのサイトを見ると「累計ダウンロード人数7000人強」... 過去7000人、誰も作者にツッコミ入れてあげなかったって事なんだろうか。初めてのExchange利用だったのでサービスに対して軽く不信感抱いてしまいました。とりあえず作者にバグ報告のメール出してみたものの... どんな返答が帰ってくるのか不安。「あぁそんなの知ってて直してないんだよ huh」みたいな応対されたらヘコむなぁ。

で、perl で良くやる

@hoge = qw(a b c d);
foreach (@hoge){
    print "$_\n";
}

[実行結果]
a
b
c
d

のような配列ループ処理を ActionScript で書くならば、

var test = [ "a","b","c" ];
for (var i=0; i < test.length; i++){
    trace(test[i] + " : " + i);
}

[実行結果]
a : 0
b : 1
c : 2

と、for 構文を使って書くとOKです。

 for .. in #ActionScript
 foreach #Perl

↑を同じ構文/機能だと判断してしまう開発者が陥るワナな訳で。
最初に発見した時は「バグだバグ!」と怒りを感じていた自分ですが、冷静になって考えてみると配列をループ処理するのに for構文 を使うのは至極当たり前なルールなのかもなぁ、と。(それにしたって 配列要素 降順 でループ処理しちゃう仕様はどうなのよ?)

Comments:2

さいとうなゆた 2007-11-14 (水) 12:53

var test = [ "a","b","c" ];
for (var i in test){
trace(test[i] + " : " + i);
}
test.reverse();
こうすればfor inでも大丈夫ですか?

ななし 2008-04-28 (月) 08:55

私もさっきscript書いてて変だなーと思ってここみつけました。

Comment Form

コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。

Remember personal info

Home > ActionScript > 配列を for .. in でまわすワナ

Search
Feeds

Page Top