Skip to content

Latest commit

 

History

History
41 lines (24 loc) · 2.67 KB

File metadata and controls

41 lines (24 loc) · 2.67 KB

配列の繰り返しとプロパティ

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プロパティ

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ループを配列で使用するのは、バグや最低のパフォーマンスの傾向があるコードを書く前兆になります。