JavaScript イテラブル
イテレート可能なオブジェクトは、for.of
で反復処理できるオブジェクトです。
技術的には、イテレータブルはSymbol.iterator
メソッドを実装します。
文字列の反復
for..of
ループを使えば、文字列の処理を繰り返し処理することができます。
配列の反復
for...of
ループを使えば、配列の要素を繰り返し処理できます。
JavaScript イテレーター
イテレータ プロトコルはオブジェクトから一連の値を生成する方法を定義します。
next()
メソッドを実装すると、オブジェクトはイテレータとなります。
next()
メソッドは、以下2つのプロパティを持つオブジェクトを返す必要があります。
- value (次の値)
- done (真または偽)
value イテレータによって返される値
(doneがtrueの場合は省略可能)done trueイテレータが完了した場合
falseイテレータが新しい値を生成した場合
ホームメイドイテラブル
このイテレート可能な変数は、
next()
が呼ばれるたびに終わりのない値を返します。例
// ホームメードイテラブル function myNumbers() { let n = 0; return { next: function() { n += 10; return {value:n, done:false}; } }; } // イテラブルを作成 const n = myNumbers(); n.next(); // Returns 10 n.next(); // Returns 20 n.next(); // Returns 30ホームメイドイテラブルの問題:
JavaScriptの
for..of
文には対応していません。JavaScriptのいてレート可能オブジェクトは、Symbol.iteratorを持つオブジェクトです。
Symbol.iterator
はnext()
関数をを返す関数です。イテラブルは次のコードで繰り返すことができます。
for (const x of iterable) { }
例
// オブジェクトを作成 myNumbers = {}; // 反復可能にする myNumbers[Symbol.iterator] = function() { let n = 0; done = false; return { next() { n += 10; if (n == 100) {done = true} return {value:n, done:done}; } }; }for..of
を使用できますfor (const num of myNumbers) { // 実行するコード }Symbol.iterator メソッドは
for..of
によって自動的に呼び出されます。ただし、「手動で」行うこともできます。
例
let iterator = myNumbers[Symbol.iterator](); while (true) { const result = iterator.next(); if (result.done) break; // 実行するコード }
プログラミング学習を加速させる
プログラミングをプロの講師に教えてもらいませんか。