この質問をされたとき、私は無知で頭が真っ白になりました。もちろん、正しく答えられませんでした。私はずっと forEach を誤解していました。本来の for ループよりもはるかに単純なので、書きやすさのために作られた糖衣構文だと思ったこともありました。ビジネスでもよく使われますが、このアプローチの問題点について考えたことはありませんでした。 forEach 使用方法 参考: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach?v=example arr.forEach(関数コールバック(現在の値、インデックス、配列) { //イテレータ }[, thisArg]);
forEach での break と return の使用に関するヒントがあります。原文は次のとおりです。
つまり、forEach で break と return を使用するのは間違いです。break または return を使用する場合は、 every または some 関数を使用してください。 それでタイトルに戻りますが、まず第一に、forEach はループから抜け出す手段を使用できません。なぜでしょうか? forEach は関数を受け取りますが、この関数には通常 2 つのパラメータがあり、1 つ目はループの現在の要素、2 つ目は要素に対応する添え字です。これを手動で実装してみましょう。 Array.prototype.myForEach = 関数 (fn) { (i = 0 とします; i < this.length; i++) { fn(this[i], i, this); } } forEach が本当にこのように実装されているかどうかはわかりませんが、上記の単純な疑似コードは forEach の特性を満たしており、実際の for ループ本体を操作する方法がないため、ループから抜け出すことができないことも明らかです。 その後、ドキュメントを調べたところ、forEach の公式定義は私が考えていたような構文上の糖衣ではないことがわかりました。その標準的な記述は、forEach は配列要素ごとに指定した関数を 1 回実行するというものです。この時点で私の考えは徐々に明確になり、公式ドキュメントにも次のような一節があります。
例外をスローして foreach ループから抜け出す arr = [0, 1, "stop", 3, 4]とします。 試す { arr.forEach(要素 => { if (要素 === "stop") { 新しいエラーをスローします("forEachBreak"); } console.log(element); // 0 1 を出力し、その後は何も出力しません }); } キャッチ (e) { console.log(e.message); // 各ブレークごとに }; もちろん、try-catch ラッパーを使用する場合、ループ本体が大きすぎるとパフォーマンスが低下しますが、これは避けられません。したがって、例外をスローすることは、forEach の問題を解決するための万能薬ではありません。最初に書いた疑似コードに戻りましょう。これを最適化し、渡された関数の判断を実際の for ループに追加します。 Array.prototype.forEach = 関数 (fn) { (i = 0 とします; i < this.length; i++) { ret = fn(this[i], i, this); とします。 if (typeof ret !== "undefined" && (ret == null || ret == false)) break; } } このように、戻り値に応じて自然にループから抜け出すことができます。 arr = [0, 1, "stop", 3, 4]とします。 arr.forEach(要素 => { if (要素 === 'stop') は false を返します console.log(element); // 0 1 を出力し、その後は何も出力しません }); console.log('return は続行を意味します:'); arr.forEach(要素 => { if (要素 === 'stop') 戻り値 console.log(要素); // 0 1 3 4 }); また、ドキュメントには、forEach には同期関数が必要であることも記載されています。つまり、非同期関数や Promise をコールバックとして使用すると予期しない結果が発生する可能性があるため、forEach は注意して使用するか、まったく使用しないでください。もちろん、これはプロジェクト開発ですべてを完了するために常に単純な for ループを使用する必要があるという意味ではありません。配列を走査する場合は for..of.. を使用し、オブジェクトを走査する場合は for..in.. を使用できます。公式には、forEach ドキュメントの下に他のツール関数もいくつかリストされています。 配列.プロトタイプ.検索() Array.prototype.findIndex() 配列.プロトタイプ.マップ() 配列.プロトタイプ.フィルター() Array.prototype.every() 配列.プロトタイプ.some() さまざまなビジネス シナリオに応じて、対応するツール機能を選択して、ビジネス ロジックをより効率的に処理します。forEach については、今後は忘れることにします。 要約する これで、 forEach がループから抜け出せるかどうかという JS 面接の質問に関するこの記事は終わりです。 JS forEach がループから抜け出すことに関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。 今後とも 123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: Centos に MYSQL8.X をインストールするチュートリアル
>>: MySQL InnoDB ストレージ エンジンの詳細
位置一致順序1. 「=」プレフィックス命令マッチング、マッチングが成功したら他のマッチングを停止2....
1. 概要ネットでいろいろ検索してみたところ、Linux システム向けではなく、現在の新しいバージ...
目次1. 電卓機能の紹介2. 計算機ページのデザイン1. ナビゲーションバー2. データ部分3. i...
一般的な基本グラフィックと私が遭遇するいくつかの小さなアイコンについて簡単に説明します。以下は CS...
ここでは、主に小さなプログラムの開発プロセスでよく使われる、非常に実用的な機能ポイントをいくつか整理...
シーンについて話すメールを送信サードパーティのウェブサイトにHTMLを埋め込む他の編集者の記事をコピ...
目次1. 手ぶれ補正機能とは何ですか? 1. なぜ手ぶれ補正機能が必要なのでしょうか? 2. 手ぶれ...
以前は、境界線の長さをコンテナーよりも小さくする必要があったときに、div ネストを使用していました...
シングルノードデータベースの欠点大規模なインターネットプログラムはユーザーベースが大きいため、アーキ...
目次1. 成果を達成する2. バックエンドの実装2.1 エンティティクラス2.2 データベース内のデ...
要件は次のとおりですテーブル構造、フィールドコメント情報、テーブル名などをエクスポートします。これは...
デフォルトでは、Docker はネットワーク化されていない UNIX ソケット上で実行されます。オプ...
1. 監視計画監視項目を作成する前に、何を監視するのか、どのように監視するのか、監視データをどのよう...
序文当社の MySQL オンライン環境のほとんどはバージョン 5.7.18 を使用しています。このバ...
目次概要Vuex の 4 つの主要オブジェクト状態の使用突然変異の使用ゲッターの使用アクションの使用...