javaScript 迭代器和生成器用于按需生成消费数据,提升遍历灵活性、节省内存、明晰 异步 流程;支持自定义结构遍历、延迟计算、异步控制及可组合数据管道。

javascript迭代器和生成器主要用于按需生成和消费数据,让遍历逻辑更灵活、内存更节省、异步流程更清晰。
简化自定义 数据结构 的遍历
当你实现一个类(比如链表、树或范围集合),默认无法用 for…of 遍历。通过部署 [symbol.iterator] 方法返回一个迭代器 对象,就能支持标准遍历语法。
- 迭代器对象必须有 next() 方法,每次调用返回 {value, done} 形式的对象
- 例如:一个数字范围类只需在 [Symbol.iterator]() 中返回一个 闭包 迭代器,就能让 for (const n of new Range(1, 3)) 输出 1、2、3
延迟计算与内存优化
生成器函数(用 function* 声明)会自动返回迭代器,且内部执行是暂停 / 恢复式的。这意味着值只在被取用时才计算,适合处理 大数据 流或无限序列。
- 比如生成 斐波那契数列:每次 next() 只算下一个数,不预先生成整个数组
- 读取大文件时,可用生成器逐行 yield,避免一次性加载全部内容到内存
简化异步流程控制
生成器配合 promise 和手动执行器(或历史上的 co 库),曾是 async/await 出现前组织异步代码的重要方式。虽然现在多用 async/await,但理解其底层逻辑仍有价值。
立即学习“Java 免费学习笔记(深入)”;
- 生成器可暂停在 yield fetch(…) 处,等 Promise resolve 后再继续,形成类似同步的书写体验
- 现代实践中,AsyncIterator(如 for await…of)已原生支持异步迭代,底层常基于生成器或直接实现
构建可组合的数据处理管道
利用迭代器的惰性特性,可以像 unix 管道一样链式处理数据:过滤、映射、截断等操作都返回新迭代器,全程不创建中间数组。
- 例如:map(iter, x => x * 2) 返回一个迭代器,只有在消费时才对每个原始值做变换
- 配合生成器,轻松写出 take(5, filter(x => x % 2 === 0, range(0, Infinity))) 这类表达式,获取前 5 个偶数
不复杂但容易忽略:它们不是语法糖,而是 JavaScript 提供的底层协议,让语言能统一处理同步 / 异步、有限 / 无限、内存内 / 流式等各种数据源。