【小ネタ】forループ内でvarしても毎回初期化されるわけではない
2ヶ月ぶりにこんにちは。安藤です。
とある配列のjsonデータを扱っていたのですが、forループで処理していたところで挙動がおかしくなり、はまってしまいました。原因は「forループ内で宣言した変数はループのたびに初期化される」という勘違いでした。
for(var i:int = 0; i< 5; i++) { var n:Number; //iが奇数ならn=1にする if(i%2 == 1) { n = 1; } trace(i,n); } /*結果 0 NaN 1 1 2 1 3 1 4 1 */
このように、初回は n == NaNとなっています(Number型のデフォルト値はNaN)が、i = 1以降のループではn == NaNとはならず、ずっと1のままです。varしたからといって真っさら新しい変数になるわけではないのですね。forループの前にnを宣言するのと同じ動作と言えます。
forループ内で配列から要素を取り出して計算して・・・というような処理の時は変数に初期値を入れるのか入れないのか、きちんと明記するようにしましょう。
for(var i:int = 0; i< 5; i++) { var n:Number = 0; //キチンと初期値代入 //iが奇数ならn=1にする if(i%2 == 1) { n = 1; } trace(i,n); } /*結果 0 0 1 1 2 0 3 1 4 0 */