javascript迭代器模式的核心是实现[symbol.iterator]()方法,返回含next()的迭代器对象,满足可迭代协议;手写链表迭代器可用普通函数或更优的生成器函数实现,需注意done后仍返回{value: undefined, done: true}、惰性求值及每次返回新迭代器。

JavaScript 中的迭代器模式,核心是让自定义数据结构支持 for...of、展开运算符([...obj])、解构等原生迭代语法。实现的关键不是写个方法,而是让对象具备符合协议的 [Symbol.iterator]() 方法,返回一个具有 next() 的迭代器对象。
迭代器协议:两个必需接口
要被 JavaScript 迭代语法识别,对象必须满足「可迭代协议」:
- 对象自身或原型链上存在
[Symbol.iterator]方法; - 该方法不接收参数,返回一个「迭代器对象」;
- 这个迭代器对象必须有
next()方法,每次调用返回形如{ value: any, done: boolean }的对象。
只要满足这三点,哪怕是个普通对象、函数甚至 class 实例,都能参与 for...of 循环。
手写一个链表的迭代器
假设你实现了一个单向链表类 LinkedList,默认无法用 for...of 遍历。只需添加 [Symbol.iterator] 方法:
class LinkedList {
constructor() {
this.head = null;
}
[Symbol.iterator]() {
let current = this.head;
return {
next() {
if (current) {
const value = current.value;
current = current.next;
return { value, done: false };
}
return { value: undefined, done: true };
}
};
}
}
这样就能直接遍历:for (const val of list) { console.log(val); },也能用 [...list] 转成数组。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
用生成器函数简化实现
手动管理状态容易出错。更推荐用 function* 生成器函数,它天然返回符合协议的迭代器:
class LinkedList {
// ...其他代码
*[Symbol.iterator]() {
let current = this.head;
while (current) {
yield current.value;
current = current.next;
}
}
}
生成器自动封装了 next() 和状态暂停/恢复逻辑,语义清晰、不易出错,是实践中最常用的方式。
注意边界与兼容性
实际使用中需留意几点:
-
done: true后再调用next(),应仍返回{ value: undefined, done: true },否则某些 API(如Array.from)可能异常; - 迭代器应是「惰性求值」的,
next()调用才计算下一个值,避免提前遍历全部数据; - 若希望支持多次遍历(如反复用
for...of),[Symbol.iterator]每次都应返回全新迭代器,而不是复用同一个对象。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










