久々にちょっと書こうと思ったらしょーもないとこで詰まって何一つ進まなかった。
// これはバグる。どこがおかしい? max = ary.length; for(i in ary) { if(i + 1 > max) break; ary[i + 1] = ary[i] * 2; }
これ、動きません。
for〜in文の落とし穴なんだろうけどこれに関する解説が見当たらなかったのでメモ。
処理の内容自体は適当なのでおいといて、これの何が問題かというと、まさかの"ary[i + 1]"なんです。
これが"ary[i]"とか"ary[1 + 1]"なら動くんですが、それでだけ動きません。
ちなみにforの外で"ary[tmp + 1]"は動きます。なぜでしょうか。
調べてみると"isNaN(i) == false", "isNaN(i + 1) == false"です。しかし参照先がずれるのではなくエラーで停止します。
これがですね、変数iは文字列型なんですよ。
"alert(i + 1)"の実行結果が"01"だったことでようやく気がつきました。
// これで通る。コードは汚い。 max = ary.length; for(i in ary) { if(i - 0 + 1 > max) break; ary[i - 0 + 1] = ary[i] * 2; }
なんでこんな仕様になっているのかと。
ここからは個人的な予想です。
カウンタなんだから数値型だろうと思っていたんですが、このfor〜in文って連想配列にも使われるんですよね。
keyにあたるものを文字列として扱う場合を想定しているせいで、デフォルトで文字列扱いするように作られているんじゃないかと思うんです。
そこを解説しているページがちょっと見当たらなかったので実際のところはわからないんですが、
クラス配列の初期化にfor〜in文を使う場合は要注意です。要素数がわかっているならfor文の方がいいですね。