JavaScriptの配列もまたオブジェクトですのでfor in ループを配列の繰り返しで使用するような理由はありません。実際、配列にfor inを使用しない為の正当な理由はたくさんあります。
注意: JavaScriptの配列は連想配列ではありません。JavaScriptはobjectsだけがキーバリューをマッピングするものです。 また、連想配列は順序を保持しますが、オブジェクトは保持しません。
for inループはプロトタイプチェーン上の全てのプロパティを列挙するため、hasOwnPropertyをそれらのプロパティの存在判定に使います。この為、通常のforループよりも20倍遅くなります。
配列の要素を繰り返すとのに、最高のパフォーマンスを出したければ昔ながらのforループを使うのが一番です。
var list = [1, 2, 3, 4, 5, ...... 100000000];
for(var i = 0, l = list.length; i < l; i++) {
console.log(list[i]);
}
上記の例では一つ余分に変数がありますが、それは配列の長さを取るためのl = list.lengthの部分です。
また、lengthプロパティは配列自身に定義されていますが、ループのそれぞれの繰り返しで探索する為のオーバーヘッドがまだあります。最近のJavaScriptエンジンはこのような場合に最適化するはずです。新しいエンジンか古いエンジンで実行されるかどうかをコードが知る方法はありません。
実際には、キャッシュを抜きにするとループの結果はキャッシュされたものに比べて、半分だけ高速になっています。
lengthプロパティのゲッターは単に配列に含まれる要素の数を返すだけにも関わらず、セッターは配列をトランケートする為にも使用できます。
var foo = [1, 2, 3, 4, 5, 6];
foo.length = 3;
foo; // [1, 2, 3]
foo.length = 6;
foo; // [1, 2, 3]
より小さいlengthを割り当てると配列をトランケートしますが、lengthが大きくなっても配列には何も影響しません。
最高のパフォーマンスの為には、常にforループを使用し、lengthプロパティをキャッシュする事をお勧めします。for inループを配列で使用するのは、バグや最低のパフォーマンスの傾向があるコードを書く前兆になります。