什么是迭代器协议和可迭代协议?如何自定义可迭代对象?
请说明 Symbol.iterator、可迭代协议(Iterable Protocol)和迭代器协议(Iterator Protocol)的概念,并自定义一个可迭代对象。
回答
我是大山
可迭代协议(Iterable Protocol):对象必须实现 [Symbol.iterator]() 方法,该方法返回一个迭代器对象。
迭代器协议(Iterator Protocol):对象必须实现 next() 方法,返回 { value: any, done: boolean }。当 done: true 时迭代结束。
内置可迭代对象:Array、String、Map、Set、TypedArray、arguments、NodeList
自定义可迭代对象:
class Range {
constructor(start, end) {
this.start = start;
this.end = end;
}
[Symbol.iterator]() {
let current = this.start;
const end = this.end;
return {
next() {
if (current <= end) {
return { value: current++, done: false };
}
return { value: undefined, done: true };
},
// 可选:return() 提前退出时清理
return() {
console.log('迭代被中断');
return { done: true };
}
};
}
}
// 使用
const range = new Range(1, 5);
for (const n of range) console.log(n); // 1 2 3 4 5
console.log([...range]); // [1, 2, 3, 4, 5]
生成器简化:
*[Symbol.iterator]() {
for (let i = this.start; i <= this.end; i++) yield i;
}
Generator 本身也是 Iterable。使用 for...of、展开运算符、解构赋值时,都会调用 [Symbol.iterator]()。