イテレータ: for...of の裏側
配列やMapがfor...ofで使える仕組み。カスタムも作れる。
イテラブル
for...of で使えるオブジェクト。
イテレータ
next() を持つオブジェクト。
Symbol.iterator
イテレータを返すメソッドのキー。
イテレータ
`for...of` ループの裏側で動いている仕組みです。配列や文字列はデフォルトで「イテラブル(繰り返し可能)」ですが、自分で作ったオブジェクトもイテレータを実装すれば `for...of` で回せるようになります。
// イテラブル = for...of で使えるconst arr = [1, 2, 3];for (const item of arr) { console.log(item);}
// イテレータを手動で使うconst iter = arr[Symbol.iterator]();iter.next(); // { value: 1, done: false }iter.next(); // { value: 2, done: false }iter.next(); // { value: 3, done: false }iter.next(); // { value: undefined, done: true }
// スプレッド構文もイテレータを使うconst copy = [...arr];Bad
// ❌ Bad: インデックスでループfor (let i = 0; i < arr.length; i++) { console.log(arr[i]);}Good
for (const item of arr) { console.log(item);}パターン
// カスタムイテラブルconst range = { from: 1, to: 5, [Symbol.iterator]() { let current = this.from; const last = this.to; return { next() { if (current <= last) { return { value: current++, done: false }; } return { done: true }; } }; }};
for (const n of range) { console.log(n); // 1, 2, 3, 4, 5}
// ジェネレータはイテレータを簡単に作れるfunction* range(from, to) { for (let i = from; i <= to; i++) { yield i; }}
for (const n of range(1, 5)) { console.log(n);} Tip: ジェネレータ関数を使えばイテレータを簡単に作れる。
合格ライン
for...of を使える
イテラブルとイテレータの違いを説明できる
演習課題
課題1: for...of
for...of でイテラブルをループしてください。
課題2: カスタムイテレータ
Symbol.iterator でカスタムイテレータを作成してください。