1. ホーム
  2. javascript

[解決済み] Javascriptの効率化:「for」 vs 「forEach」 [終了しました]

2022-05-15 05:55:53

質問

Javascriptでfor()ループと.forEachの2017年の現在の標準は何でしょう。

私は現在、UdemyのColt Steeles "Web Dev Bootcamp"で作業していますが、彼は forEach より for を教えの中に入れています。しかし、コースワークの一環である演習でいろいろと検索してみたところ、ますます for -ループではなく forEach . ほとんどの人は、forループの方が効率的だと述べているようです。

これは、コースが書かれたとき(2015年頃)から変わったことなのか、それとも本当にそれぞれに長所と短所があり、経験を重ねることで学んでいくものなのでしょうか。

何かアドバイスがあれば、よろしくお願いします。

どのように解決するのですか?

のために

for ループはより効率的です。 これは、ある条件が満たされている間、繰り返し処理を行うために特別に設計されたループ構成です。 同時にステップ機構(一般にイテレータを増加させる)を提供します。例

for (var i=0, n=arr.length; i < n; ++i ) {
   ...
}

これは に対して -ループの方が常に効率的であるということではなく、JS エンジンとブラウザがそうなるように最適化してきたということです。 長年にわたり、どのループ構成がより効率的か(for、while、reduce、reverse-while など)についての妥協点がありました。 ブラウザがパフォーマンスの要求を満たすためにさらに最適化されると、理論的には [].forEach と同等かそれ以上に速くなるように実装することができます。 for .

メリット

  • 効率的
  • ループの早期終了(honors breakcontinue )
  • 条件制御 ( i<n は何でもよく、配列のサイズに縛られることはない)
  • 変数のスコープ ( var ii ループ終了後に使用可能)

forEach

.forEach は、主に配列に対して反復処理を行うメソッドです。 MapSet オブジェクトを含む)。 これらは より新しい であり、主観的に読みやすいコードを提供します。例

[].forEach((val, index)=>{
   ...
});

メリット

  • 変数の設定が不要 (配列の各要素を繰り返し処理)
  • 関数/矢印関数は、変数をブロックにスコープする

    上の例では val は新しく作成された関数のパラメータになります。 したがって val と呼ばれる変数は、ループが終了した後もその値を保持します。
  • コードが何を行っているかを識別するのがより簡単であるため、主観的にはより保守的である。

パフォーマンス

パフォーマンスは厄介なトピックで、一般に、先見性やアプローチに関してある程度の経験が必要です。 どの程度の最適化が必要かを (開発中に) 事前に判断するために、プログラマーは問題ケースに関する過去の経験や、潜在的な解決策をよく理解しておく必要があります。

あるケースでは jQuery を使用すると、あるときは遅すぎるかもしれませんが (経験豊富な開発者はそれを知っているかもしれません)、別のときは問題ないかもしれません。その場合、ライブラリのクロスブラウザ対応と他の機能 (たとえば、AJAX、イベント処理) の実行の容易さは、開発 (とメンテナンス) 時間を節約する価値があるでしょう。

もうひとつの例として、もしパフォーマンスと最適化がすべてであれば、機械語やアセンブリ以外のコードは存在しないでしょう。 多くの異なる高レベルおよび低レベルの言語があり、それぞれが独自のトレードオフを持っているので、明らかにそうではありません。 これらのトレードオフには、専門性、開発の容易さと速度、メンテナンスの容易さと速度、最適化されたコード、エラーのないコードなどが含まれますが、これらに限定されるものではありません。

アプローチ

最適化されたコードが必要かどうかをよく理解していない場合、一般に、最初に保守可能なコードを書くのがよい経験則です。 そこから、テストして、必要なときにもっと注意を払う必要があるものをピンポイントで見つけることができます。

とはいえ、ある種の明白な最適化は一般的なプラクティスの一部であり、考える必要はありません。 例えば、次のようなループを考えてみてください。

for (var i=0; i < arr.length; ++i ){}

ループの各反復に対して、JavaScript は arr.length という、各サイクルでのキールックアップコスト演算を行う。 そうでない理由はありません。

for (var i=0, n=arr.length; i < n; ++i){}

これは同じことをしますが、検索するのは arr.length を一度だけ取得し、変数をキャッシュしてコードを最適化します。