反復可能オブジェクト (Iterable object) は配列を一般化したもので、あらゆるオブジェクトを for...of ループで使用できるオブジェクトとしてカスタマイズできることを意味します。
つまり、for...of を適用できるオブジェクトは反復可能オブジェクトと呼ばれます。
イテレータ
JavaScript では、イテレータはシーケンスを定義するオブジェクトであり、終了時に戻り値を返す可能性があります。
より具体的には、イテレータは、次の 2 つのプロパティを持つオブジェクトを返すnext()
メソッドを使用して実装されたIterator protocol
オブジェクトです。
- value、シーケンス内の次の値
- 完了。シーケンス内の最後の値が反復された場合は true、反復された
場合value 和 done 一起存在
、それは反復子の戻り値です。
イテレータ オブジェクトを作成すると、显式
next() を繰り返し呼び出して反復処理できます。
イテレータを反復処理すると、通常は 1 回しか実行できないため、イテレータが消費されると言われます。
終了値を生成した後、 next() への追加の呼び出しは引き続き を返す必要があります{done: true}
。
Javascript で最も一般的なイテレータは、Array 迭代器
単純に連想配列内の各値を順番に返すものです。
すべての反復子が配列として表現できることは容易に想像できますが、そうではありません。配列は完全に割り当てる必要がありますが、反復子は必要な場合にのみ使用されるため、0 から無限までの整数範囲など、無制限のサイズのシーケンスを表すことができます。
これを実行できる例を次に示します。これにより、開始 (これを含む) から終了 (これを含まない) までの間隔ステップを持つ整数のシーケンスを定義する単純な範囲反復子を作成できます。最終的な戻り値は、変数 iterationCount によって追跡される、作成されたシーケンスのサイズです。
let index = 0
const bears = ['ice', 'panda', 'grizzly']
let iterator = {
next() {
if (index < bears.length) {
return {
done: false, value: bears[index++] }
}
return {
done: true, value: undefined }
}
}
console.log(iterator.next()) //{ done: false, value: 'ice' }
console.log(iterator.next()) //{ done: false, value: 'panda' }
console.log(iterator.next()) //{ done: false, value: 'grizzly' }
console.log(iterator.next()) //{ done: true, value: undefined }
反復可能なオブジェクトを実装する
オブジェクトに[Symbol.iterator]
イテレータ オブジェクトを返すメソッドがある場合、そのオブジェクトが呼び出されます可迭代对象
。
let info = {
bears: ['ice', 'panda', 'grizzly'],
[Symbol.iterator]: function() {
let index = 0
let _iterator = {
//这里一定要箭头函数,或者手动保存上层作用域的this
next: () => {
if (index < this.bears.length) {
return {
done: false, value: this.bears[index++] }
}
return {
done: true, value: undefined }
}
}
return _iterator
}
}
let iter = info[Symbol.iterator]()
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
console.log(iter.next())
//符合可迭代对象协议 就可以利用 for of 遍历
for (let bear of info) {
console.log(bear)
}
//ice panda grizzly