ES6は、JavaScript言語に多くの新機能を導入しました。これらの機能の2つ、ジェネレーターとイテレーターは、より複雑なフロントエンドコードで特定の機能を作成する方法を大きく変更しました。
彼らはうまく機能しますが、実際の機能は少し混乱する可能性がありますので、詳しく見てみましょう。
反復はプログラミングにおける一般的な慣行であり、通常、一連の値をループしたり、各値を変換したり、後で使用するために何らかの方法で使用または保存するために使用されます。
JavaScriptでは、私たちは常にループ用のようなものを持っています:
for (var i = 0; i < foo.length; i++) { // 对i执行某些操作 }
for (const i of foo) { // 对i执行某些操作 }
配列内の各番号が素数であるかどうかを確認したいとします。これを行う関数を作成することでこれを行うことができます。このように見えるかもしれません:
function isPrime(number) { if (number <= 1) { return false; } else if (number === 2) { return true; } for (var i = 2; i < number; i++) { if (number % i === 0) { return false; break; } } return true; }
var possiblePrimes = [73, 6, 90, 19, 15]; var confirmedPrimes = []; for (var i = 0; i < possiblePrimes.length; i++) { if (isPrime(possiblePrimes[i])) { confirmedPrimes.push(possiblePrimes[i]); } } // confirmedPrimes现在是[73, 19]
const possiblePrimes = [73, 6, 90, 19, 15]; const confirmedPrimes = []; for (const i of possiblePrimes){ if ( isPrime(i) ){ confirmedPrimes.push(i); } } // confirmedPrimes现在是[73, 19]
舞台裏では、この反復によりES6の光沢のある新しいSymbol.iterator()メソッドが活用されます。この方法は反復を記述する責任があり、呼び出されると、ループの次の値を含むJavaScriptオブジェクトと、ループが完了するかどうかに応じてtrueまたはfalseです。
この詳細に興味がある場合は、Jake Archibaldのこの素晴らしいブログ投稿「Iterators Gongent Iterate」を読むことができます。この記事の別の部分であるジェネレーターを掘り下げるにつれて、舞台裏で何が起こっているのかについても良いアイデアを提供します。
ジェネレーター
わかりました、それはどういう意味ですか?例を見てみましょう。関数が必要であり、それを呼ぶたびに、次の素数が与えられるとします:
for (var i = 0; i < foo.length; i++) { // 对i执行某些操作 }
別の奇妙な部分は、収量キーワードです。これは、実際に発電機がそれを呼ぶときに吐き出すものです。返すのはほぼ同等ですが、呼び出されるたびにすべてを再実行するのではなく、関数の状態を保持します。実行時にその位置を「覚えている」ので、次にそれを呼ぶとき、それは割り込みから続きます。
これは、これを行うことができることを意味します:
for (const i of foo) { // 对i执行某些操作 }
function isPrime(number) { if (number <= 1) { return false; } else if (number === 2) { return true; } for (var i = 2; i < number; i++) { if (number % i === 0) { return false; break; } } return true; }
ここで、完了キーは、関数がタスクを完了したかどうかを示します。私たちの場合、私たちの機能は決して終わりません。これにより、理論的にはすべての素数が無限まで与えます(コンピューターメモリがたくさんある場合)。
var possiblePrimes = [73, 6, 90, 19, 15]; var confirmedPrimes = []; for (var i = 0; i < possiblePrimes.length; i++) { if (isPrime(possiblePrimes[i])) { confirmedPrimes.push(possiblePrimes[i]); } } // confirmedPrimes现在是[73, 19]
かっこいいので、今すぐ発電機とイテレーターを使用できますか?
結論
ジェネレーターとイテレーターは、JavaScriptの問題へのアプローチに対して非常に多くの新しい柔軟性を提供します。イテレーターを使用すると、ループをよりPythonのような方法で書き込むことができます。つまり、コードはよりクリーンで読みやすく見えます。
これらのジェネレーターとイテレーターのサポートは良いです。インターネットエクスプローラーを除き、ノードおよびすべての最新のブラウザでサポートされています。古いブラウザをサポートする必要がある場合は、最良の方法はBabelのような翻訳者を使用することです。
ECMAScript 2015ジェネレーターとイテレーター(FAQ)
ECMAScript 2015の次の()メソッドの目的は何ですか? eviedキーワードは、ecmascript 2015の一時停止および復元ジェネレーター関数(関数*またはレガシージェネレーター関数)に使用されます。利回りは、ジェネレーター関数から値を返すことができます。この返品値は通常、値と完了の2つのプロパティを持つオブジェクトです。値属性は、降伏式を計算した結果であり、完了は、発電機が最後の値を生成したかどうかを示すブール値です。
Symbol.iteratorは、ECMAScript 2015の特別な組み込みシンボルです。オブジェクトのデフォルトのイテレータを指定するために使用されます。オブジェクトを繰り返す必要がある場合(たとえば、loopのforの先頭に)、その@@ iteratorメソッドは引数なしで呼び出され、返されたイテレーターは値を繰り返すために使用します。
もちろん、これはECMAScript 2015のジェネレーター関数の簡単な例です。
この例では、IDMaker関数は、一連の数字を生成するジェネレーターです。for (var i = 0; i < foo.length; i++) { // 对i执行某些操作 }
ECMAScript 2015でThro()メソッドとジェネレーターを使用する方法は?
ECMAScript 2015のTHRO()メソッドをジェネレーターで使用して、発電機関数の実行を復元し、降伏式からエラーを投げることができます。 Thro()メソッドは、発電機関数の実行中に発生するエラーを処理するために使用できます。実行されたプロパティは、ECMAScript 2015のIteratorによって返されるブール値です。 Iteratorがより多くの値を返すかどうかを示します。完了した場合、イテレーターは反復シーケンスの終了を超えています。完了した場合、イテレーターはさらに多くの値を生成できます。
以上がES6ジェネレーターとイテレーター:開発者ガイドの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。