ecmascript:iteration
Iteration Protocol
反復処理プロトコルはfor...of構文で処理できるオブジェクトが実装しているべき約束事。反復可能プロトコル(Iterable Protocol)とイテレータプロトコル(Iterator Protocol)の2つで構成されている。
反復可能プロトコル
[Symbol.iterator]メソッドを実装していること。[Symbol.iterator]メソッドはイテレータプロトコルを実装したオブジェクトを返さなければならない。
Array、NodeList、Set、Mapなどは反復可能プロトコルを実装している。
イテレータプロトコル
nextメソッドを実装していること。nextメソッドは
interface IteratorResult<T> {
done?: boolean;
value?: T;
}
を実装したオブジェクトを返す。valueは反復処理で取得される値。反復処理が全て終わった場合は { done: true } を返す。
サンプル
const iterator = { count: 0, next() { if (this.count < 5) { return { value: this.count++ }; } return { done: true }; } }; const iterable = { [Symbol.iterator]() { return Object.create(iterator); } }; for (const num of iterable) { console.log(num); // => 0, 1, 2, 3, 4 } console.log(Array.from(iterable)); // => `[0,1,2,3,4]`
同じオブジェクトで反復可能プロトコル、イテレータプロトコル両方を実装しても構わない
const iteration = { count: 0, next() { if (this.count < 5) { return { value: this.count++, done: false }; } return { value: undefined, done: true }; }, [Symbol.iterator]() { return this; }, }; for (const num of iteration) { console.log(num); }
ecmascript/iteration.txt · 最終更新: by nullpon