JavaScript迭代器协议要求对象实现Symbol.iterator方法,该方法返回含next()的对象;next()每次返回{value, done},done为true时终止遍历。
JavaScript 的迭代器协议是一套约定,让对象能被 for...of 循环、展开运算符([...iterable])、解构赋值等语法识别和遍历。它不依赖具体类型,而是看对象是否实现了特定方法。
一个对象只要拥有名为 Symbol.iterator 的方法,且该方法返回一个符合迭代器接口的对象,它就是可迭代的(iterable)。
obj[Symbol.iterator] 访问next() 方法,每次调用返回形如 { value: ..., done: true|false } 的对象next() 是迭代器协议的执行核心。它控制“下一步取什么”,并决定是否结束遍历。
next() 返回第一个元素的 value,done: false
{ value: undefined, done: true }
done: true 是终止信号,for...of 等语法一旦收到就停止循环下面代码手动实现一个类数组对象的迭代器,帮助理解协议细节:
const myIterable = {
data: ['a', 'b', 'c'],
[Symbol.iterator]() {
let index = 0;
return {
next: () => {
if (index < this.data.length) {
return { value: this.data[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
for (cons
t item of myIterable) {
console.log(item); // 输出 a, b, c
}
多数标准数据结构已内置 Symbol.iterator,开箱即用:
for...of,需借助 Object.keys()、Object.values() 或 Object.entries() 转为数组再遍历