ために
for
ループははるかに効率的です。これは、条件がtrueである間反復するように特別に設計されたループ構造であり、同時にステップ機構を提供します(通常、反復子を増やすため)。例:
for (var i=0, n=arr.length; i < n; ++i ) {
...
}
JSエンジンとブラウザがforループを最適化しているため、forループが常により効率的であると示唆しているわけではありません。長年にわたって、どのループ構造がより効率的であるか(for while、reduce、reverse-whileなど)について妥協がありました。異なるブラウザーとJSエンジンには、同じ結果を生成するための異なる方法を提供する独自の実装があります。ブラウザーがパフォーマンスの要求に合わせてさらに最適化されると、理論的に[].forEach
はに匹敵するより高速または同等の方法で実装できますfor
。
利点:
- 効率的
- 早期ループ終了(名誉
break
とcontinue
)
- 条件制御(
i<n
配列のサイズにバインドされていない、何でもかまいません)
- 変数のスコープ(ループの終了後に利用可能な
var i
葉i
)
forEach
.forEach
は主に配列(Map
およびSet
オブジェクトなどの他の列挙可能なオブジェクト)を反復処理するメソッドです。それらはより新しく、主観的に読みやすいコードを提供します。例:
[].forEach((val, index)=>{
...
});
利点:
- 変数の設定は含まれません(配列の各要素を繰り返します)
- functions / arrow-functionsは、変数をブロックにスコープします。
上の例val
では、新しく作成された関数のパラメーターになります。したがって、val
ループの前に呼び出された変数は、終了後に値を保持します。
- コードが何をしているのかを特定するのが簡単になる可能性があるため、主観的に保守しやすくなります。一方、forループは、任意の数のループスキームに使用できます。
パフォーマンス
パフォーマンスはトリッキーなトピックであり、一般的に先見性やアプローチに関してある程度の経験が必要です。事前に(開発中に)どれだけの最適化が必要になるかを判断するには、プログラマーは問題のケースでの過去の経験を十分に理解し、潜在的な解決策を十分に理解している必要があります。
場合によってはjQueryの使用が遅すぎることがあります(経験豊富な開発者はそれを知っている可能性があります)。それ以外の場合は問題にならないこともあります。イベント処理)は、開発(および保守)時間を節約する価値があります。
別の例としては、パフォーマンスと最適化がすべてである場合、マシンまたはアセンブリ以外のコードはありません。多くの異なる高水準言語と低水準言語があり、それぞれに独自のトレードオフがあるため、明らかにそうではありません。これらのトレードオフには、特殊化、開発の容易さと速度、保守の容易さと速度、最適化されたコード、エラーのないコードなどが含まれますが、これらに限定されません。
アプローチ
何かが最適化されたコードを必要とするかどうかについて十分に理解していない場合、一般的には、最初に保守可能なコードを作成することをお勧めします。そこから、必要なときにさらに注意が必要なものをテストして特定できます。
とはいえ、特定の明らかな最適化は一般的な実践の一部であり、何も考える必要はありません。たとえば、次のループについて考えてみます。
for (var i=0; i < arr.length; ++i ){}
ループの反復ごとに、JavaScriptはを取得しarr.length
ます。これは、各サイクルの主要なコスト計算オペレーションです。これがあってはならない理由はありません:
for (var i=0, n=arr.length; i < n; ++i){}
これは同じことを行いますarr.length
が、取得は1回だけで、変数をキャッシュしてコードを最適化します。