[解決済み] Javascriptの効率化:「for」 vs 「forEach」 [終了しました]
質問
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
break
とcontinue
) -
条件制御 (
i<n
は何でもよく、配列のサイズに縛られることはない) -
変数のスコープ (
var i
葉i
ループ終了後に使用可能)
forEach
.forEach
は、主に配列に対して反復処理を行うメソッドです。
Map
と
Set
オブジェクトを含む)。 これらは
より新しい
であり、主観的に読みやすいコードを提供します。例
[].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
を一度だけ取得し、変数をキャッシュしてコードを最適化します。
関連
-
[解決済み】SyntaxError: JSONの位置1に予期しないトークンoがある。
-
[解決済み] 期待される代入または関数呼び出し: 未使用式なし ReactJS
-
[解決済み】ERROR エラーです。スイッチのname属性が指定されていないフォームコントロールの値アクセッサがない
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] JavaScriptのオブジェクトをループスルーまたは列挙するにはどうすればよいですか?
-
[解決済み】PHPの'foreach'は実際どのように動作するのですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
元のイベントが実行されなかった後に要素を追加するためのjQueryソリューション
-
vueはopenlayersを使用してスカイマップとガオードマップをロードする
-
vue+webrtc(Tencent cloud)ライブ機能の実践を実現するために
-
Vueのフィルタの説明
-
[解決済み】TypeError: Router.use() はミドルウェアの関数を要求しているが、Object を取得した。
-
[解決済み】JavaScriptエラー(Uncaught SyntaxError: Unexpected end of input)
-
HTML5 LocalStorage ローカルストレージとセッションストレージの使用法
-
JavaScriptのStringに関する共通メソッド
-
nullのプロパティinnerHTMLを読み取れません エラーメッセージ
-
Uncaught TypeError: null のプロパティ 'offsetHeight' を読み取れませんでした。