Es6-iterator
ES6-イテレーター
イテレーターの紹介
イテレータは、オブジェクトのコレクションに一度に1つずつアクセスできるようにするオブジェクトです。
次の組み込み型はデフォルトで反復可能です-
- ひも
- アレイ
- Map
- Set
キーが [Symbol.iterator] である関数を実装し、イテレーターを返す場合、オブジェクトは*反復可能*と見なされます。 for … ofループを使用して、コレクションを反復できます。
例
次の例では、 for..of ループを使用して、配列を宣言し、マークを付けて繰り返し処理します。
上記のコードの出力は以下のようになります-
例
次の例では、配列を宣言し、イテレータオブジェクトをマークして取得します。 * [Symbol.iterator]()を使用して、イテレーターオブジェクトを取得できます。 イテレータのnext()メソッドは、 *'value' および 'done' プロパティを持つオブジェクトを返します。 'done’はブール値であり、コレクション内のすべてのアイテムを読み取った後にtrueを返します。
上記のコードの出力は以下のようになります-
カスタム反復可能
JavaScriptの特定のタイプは反復可能です(例: 配列、マップなど)が他の場合はありません(例: クラス)。 デフォルトで反復可能でないJavaScriptタイプは、反復可能プロトコルを使用して反復できます。
次の例では、複数の顧客オブジェクトを配列として格納する CustomerList という名前のクラスを定義しています。 各顧客オブジェクトには、firstNameプロパティとlastNameプロパティがあります。
このクラスを反復可能にするには、クラスが* [Symbol.iterator]()関数を実装する必要があります。 この関数は、反復子オブジェクトを返します。 イテレータオブジェクトには、オブジェクト *\ {value: 'customer'、done:true/false} を返す関数 next があります。
上記のコードの出力は次のようになります-
ジェネレータ
ES6より前は、JavaScriptの関数は実行完了モデルに従っていました。 ES6には、途中で停止し、停止したところから続行できるジェネレーターと呼ばれる機能が導入されています。
ジェネレーターは、関数名の前にアスタリスク*文字を付け、1つ以上の yield ステートメントを含みます。 yield キーワードはイテレーターオブジェクトを返します。
構文
例
この例では、3つのyieldステートメントでジェネレーター関数 getMarks を定義しています。 通常の関数とは異なり、* generator関数getMarks()*は、呼び出されても関数を実行しませんが、ジェネレーター関数内のコードの実行に役立つイテレーターオブジェクトを返します。
- markIter.next()の最初の呼び出しで、最初の操作が実行され、yieldステートメントがジェネレーターの実行を一時停止します。 * markIter.next()*への後続の呼び出しは、次の *yield 式までジェネレーター関数を再開します。
上記のコードの出力は以下のようになります-
例
次の例では、
- evenNumberGeneratorジェネレーター関数。
以下に示すように、* next()または *for of ループを使用して、すべての偶数を反復処理できます。
上記のコードの出力は次のようになります-