要实现JavaScript迭代器协议,需使对象拥有[Symbol.iterator]()方法并返回含next()方法的迭代器对象;next()每次返回{value, done}。

要实现 JavaScript 的迭代器协议,核心是让一个对象拥有 [Symbol.iterator]() 方法,并且该方法返回一个符合迭代器接口的对象(即具有 next() 方法,返回形如 { value, done } 的对象)。
1. 迭代器协议的两个关键部分
JavaScript 的迭代协议其实分两层:
-
可迭代协议(Iterable Protocol):对象必须有
Symbol.iterator方法,调用后返回一个迭代器对象。 -
迭代器协议(Iterator Protocol):返回的对象必须有
next()方法,每次调用返回{ value: any, done: boolean }。
2. 手动实现一个简单迭代器
比如实现一个能遍历数字区间 [start, end] 的可迭代对象:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
const range = {
from: 1,
to: 3,
[Symbol.iterator]() {
let current = this.from;
return {
next: () => {
if (current <= this.to) {
return { value: current++, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
// 使用
for (const num of range) {
console.log(num); // 1, 2, 3
}
3. 用生成器函数更简洁地实现
生成器函数(function*)自动满足迭代器协议,内部 yield 的值就是 next() 返回的 value,函数结束时自动返回 done: true:
立即学习“Java免费学习笔记(深入)”;
const range = {
from: 1,
to: 3,
*[Symbol.iterator]() {
for (let i = this.from; i <= this.to; i++) {
yield i;
}
}
};
这是最常用、最推荐的方式——简洁、可读、自动管理状态。
4. 注意事项和常见坑
-
next()必须始终返回对象,不能返回null或undefined(否则会报错TypeError: Iterator result undefined is not an object)。 -
done: true后再调用next(),仍应返回{ value: undefined, done: true }(规范要求)。 - 迭代器对象通常**不重用**;每次
for...of都会重新调用[Symbol.iterator]()获取新迭代器。 - 数组、Map、Set 等内置类型都原生实现了该协议,所以能直接用于
for...of、展开运算符、解构等。

















