ソースを記入してください:グレープ市の公式サイト、ブドウ市は、開発者を有効にする開発者は、ソリューション、サービス、のための専門的な開発ツールを提供します。
オリジナルソースします。https://blog.bitsrc.io/3-flavors-of-the-for-loop-in-javascript-and-when-to-use-them-f0fb5501bdf3
任意の開発言語学習の時間では、循環のために不可欠な構文で、すべての開発者がそれを使用しますがあります。各サイクルで、少なくとも1つのプログラミング言語の構文のバージョンが含まれるように、それは、非常に古典的です。しかし、JavaScriptは(我々はそれに注意を払っているのであれば、4あるとしてカウントすることができる)ループ構文の3種類が含まれています。
次のようにこれらの使用は、たとえば、まったく同じではありません。
古典的なループ構文についてリットル
以下のために...で... .of及はL
リットルの名手・ポイント・バージョン:.forEach
次に、私は、これらの3つの構文の類似点と相違点は、使用すると、どのような時に最良の結果を得るためにそれらを使用する方法をどのような次の時間をご紹介したいと思います。さて、始めましょう。
サイクリング古典のための
この構文は、我々はここであなたが内部カウンタを定義することができ、ループのために、非常に明確されている必要があり、対応する割り込み条件と(通常はデクリメントさもインクリメントすることができます)柔軟なステッパー戦略を設定します。
構文は次のとおりです。
用{(; [割り込み条件] [ステップポリシー] [定義カウンター]) // ... TODO }
あなたはまた、例えば、同様の文を書いたしなければならない前に、私は私のプレゼンテーションにもわかりません。
用(LETカウンタ= 0;カウンタ<10、カウンタ++ ){ にconsole.log(カウンタ) }
のは、Chromeでそれを実行してみましょう、結果も予想に沿ったものであるが、ループのためだけのでまだありますか?
あなたはループのための考えることができる3つの式であります
ため( [サイクルの開始時にのみ表現一度実行される]; [各論理判断が式と一致するために必要とされる]; [ステップあたりのサイクルが実行される表現] )
あなたは、たとえば、のカウンターに影響を与えることなく、各ステップ式で実行されるループまたは実行コードのための複数のカウンタを使用することができることを意味し、このような表現:
以下のために(; <10 && B <100; = 0、B = 0せ++、B + = 10 ){ にconsole.logを(A、B) }
私たちは、それがより現実的なシナリオになってみましょう、さらに行くことができます:
用(LETのA = 0、B = 0; <B && 10 <100;はconsole.logは( "あなたは今されたカウンタ:"、++、B + = 2)){}
また、あなたも途中式が関数呼び出しで置き換えることができ、限り、あなたは覚えているように、関数の戻り値はブール型にする必要があるか、ブール値に変換することができます。たとえば、次のとおりです。
関数isItDone(A){ にconsole.log( "!函数被调用" ) を返す <10 } ため(= 0せ; isItDone(A); ++を){ にconsole.log(A) }
その後、非同期コードを処理する方法のための古典的なサイクルで?それはどのように非同期の罠に落ちないことを確認するには?
非同期/のawait、非同期コードを扱うとき、これは簡単に私たちを行います、制御、など:私はあなたに新しい友人を紹介します
CONSTのfs =が必要です( "FS" ) 非同期機能読ん(fnameは){ 返す 新しい約束((解決、拒否)=> { fs.readFile(fnameは、(ERR、コンテンツ) => { 場合(ERR)のリターンをERR(拒否) 解決(content.toString()) }) }) } (非同期() => { せファイル = [ 'file1.json'、 'file2.json' ] のための(I = 0を聞かせて、私はfiles.lengthを<。私は++ ){ fcontentましょう =が読み待つ(ファイル[i])と はconsole.log(fcontent) はconsole.log( "-------") } })()
以下のために...及中のため...の
彼らは非常に似ていますが、彼らはサイクルの同じタイプではありません。
私たちは簡単にそれらを説明してみましょう:
以下のために...カスタムオブジェクトはハッシュテーブルまたは辞書として使用する場合、列挙オブジェクトの属性をループで、つまり、時間内に、彼らは非常にシンプルになりますについて...トラバーサルを使用します。
しかし、そのためのサイクルに依存しないでください、トラバーサル順序が注文執行の要素に基づいていることに注意してください。
{MYMAPせ :UNO 1 、 DOS: 2 、 トレスは: 3 } のために(キーせにおけるMYMAPを){ にconsole.log(キー、 "=" 、MYMAP [キー])。 }
非常にシンプルに見えますが、唯一の物理オブジェクトを通過するために...、このような文字列を横断するように、非実体便利な場合は、次のように状況が開催されます、覚えておいてください:
用(Kを聞かせて中に"Hello World!" {) はconsole.log(K) }
あなたが見ることができるようにするので、数字を横断することは一切使用しないではない、それぞれの文字を横断していなかったが、各属性を横断するために、結果から見ることができるの「Hello World!」[1]と同じです対応する文字を返します。
あなたは、各文字を歩くしたい場合は逆に、あなたは他の変異体を使用する必要がありますについては...の
用(聞かせて文字の"Hello World!"の{) はconsole.log(チャー) }
この構文を使用する、要素に対応する値に戻すことが可能であるため、このサイクルアプローチは、文字列、同じユースケースのより効果的なタイプです。したがって、我々は、のために...オブジェクトを横断上記のユースケースは、コンテンツの価値であることがわかりました。
我々は、彼らは財産、トラバーサル値同士を横断していることがわかります上記の例を通じて、我々は両方のプロパティ値を取得し、それを得ることができる方法はありません、答えはイエスです、エントリメソッドを使用し、以下のように、あなたは、同時にプロパティと値を取得することができますそれは示しています。
myArr = [ "こんにちは"、 "世界"ましょう] のために(myArr.entriesの[IDX、値]()){ にconsole.log(IDX、 '=' 、値) }
非同期コードを扱うときに最後に、それは何ですか?もちろん、答えはループの場合と同じです。
CONSTのfs =が必要です( "FS" ) 非同期機能読ん(fnameは){ 返す 新しい約束((解決、拒否)=> { fs.readFile(fnameは、(ERR、コンテンツ) => { 場合(ERR)のリターンをERR(拒否) 解決(content.toString()) }) }) } (非同期() => { せファイル = [ 'file2.json'、 'file2.json' ] のためのファイルの(FNAME){ fcontentせ =を(読み取り待ちますFNAME) にconsole.log(fcontent) はconsole.log("-------" ) } ため(IDX で{ファイル) fcontentせ =は(ファイル[IDX])読み取り待つ はconsole.log(fcontent) はconsole.log( "------" ) } })()
最後に、我々は再びのために要約する短い方法を使用して...にとのために...違いを
以下のための...プロパティをトラバースin--
以下のための... of--トラバーサル値
.forEachサイクル
これは私が不可欠を通じて宣言的な方法で記述された宣言構文やコードが好きという理由だけで、おそらく私のお気に入りの一つです。
そして時に、上記のループ構文にもかかわらず同様、非常に良いユースケースを持っているが、我々は、データ自体、forEachの良い使用に焦点を当てる必要があります。
いずれの場合においても、最初の脇哲学に関する議論を脇に置く、.foreach方法は、forループの別のバージョンであるが、この方法は、目的行うために機能し、追加のオプションのパラメータを受信するオブジェクトのアレイの一部であります機能関数コンテキストを再定義します。
(あなたがそれを使用に慣れているので、はい、それは3だのではなく、1)配列の各要素については、当社の機能が実行され、それは3つのパラメータを受け取ります。彼らは以下のとおりです。
- 現在の要素が処理されています。
- 以下のために使用しようとする私たちの作業を簡略化した要素のインデックス...サイクル実装
- 実際の配列は、処理されています。念のためにあなたが何かをする必要があります。
それでは、簡単な例を見てみましょう:
A = [ "こんにちは"、 "世界" ] a.forEach((ELEM、IDX、ARR) => { にconsole.log(ELEM、 "内部"、IDX、 "AT" 、ARR) })
より速く、より簡単に、それはないですか?
しかし、あなたは我々が簡単に関数内のすべてのプロパティを使用する方法を見ることができます。ここでは、foreachの方法では、オプションの二番目のパラメータを使用する例を示します。
クラスPerson { コンストラクタ(名前){ この .nameの= 名前 } } 関数挨拶(人){ はconsole.log(この .greeting.replace( "$" 、person.name)) } 英語ましょう = { 挨拶を:「こんにちは、$」 } スペイン語ましょう = { 挨拶を: "はいはい$を、¿コモestás"? } 人々は聞かせて = [ 新しい人( "フェルナンド")、新しい人( "フェデリコ")、新しい人( "フェリペ" )] (英語挨拶)people.forEach people.forEach(スペイン語、挨拶)
呼び出された関数の挨拶の内容を書き換えることで、私は自分のコードに影響を与えることなく、自分の行動を変えることができます。
最後に、表示方法はまた、以下は一例であり、非同期コードを使用することができます。
CONSTのfs =が必要です( "FS" ) 非同期機能読ん(fnameは){ 返す 新しい約束((解決、拒否)=> { fs.readFile(fnameは、(ERR、コンテンツ) => { 場合(ERR)のリターンをERR(拒否) 解決(content.toString()) }) }) } せファイル = [ 'file1.json'、 'file2.json' ] files.forEach(非同期FNAME => { せfcontent =を待つ読み取る(FNAME) にconsole.log (fcontent) はconsole.log( "------" ) })
結論
これは、私はあなたが今、それらの明確な理解を持っていることを望みます、と私たちの現在の知識と実際のニーズに応じてお好みのサイクルを選択することができ、私はサイクルの全体の内容にはJavaScriptについて共有したいです。