要实现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
3. 用生成器函数更简洁地实现
生成器函数(function*)自动满足迭代器协议,内部 yield 的值就是 next() 返回的 value,函数结束时自动返回 done: true:
const range = {
from: 1,
to: 3,
*[Symbol.iterator]() {
for (let i = this.from; 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、展开运算符、解构等。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










