迭代器是遵循next方法返回value和done的对象,生成器函数用function*定义并配合yield实现暂停与恢复,二者共同支持按需取值。

JavaScript中的迭代器和生成器是处理数据序列的重要工具,尤其在面对大量或动态生成的数据时非常有用。理解它们的关键在于掌握“按需取值”的思想,而不是一次性获取所有数据。
什么是迭代器(Iterator)?
迭代器是一个对象,它定义了一个序列,并可能返回一系列值的最终状态。迭代器遵循迭代器协议:只要一个对象有 next() 方法,且该方法返回一个包含 value 和 done 属性的对象,就认为它是迭代器。
比如手动创建一个简单的数组迭代器:
const arr = [1, 2, 3]; const iter = arr[Symbol.iterator]();iter.next(); // { value: 1, done: false } iter.next(); // { value: 2, done: false } iter.next(); // { value: 3, done: false } iter.next(); // { value: undefined, done: true }
当 done 为 true 时,表示遍历结束。很多结构如数组、字符串、Map、Set 都内置了迭代器,因此可以用 for...of 循环遍历。
立即学习“Java免费学习笔记(深入)”;
什么是生成器(Generator)?
生成器是一种特殊函数,能暂停执行并恢复,由 function* 定义,配合 yield 使用。调用生成器函数不会立即执行,而是返回一个生成器对象——这个对象既是可迭代的,也是迭代器。
ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有
看一个简单例子:
function* count() {
yield 1;
yield 2;
yield 3;
}
const gen = count();
gen.next(); // { value: 1, done: false }
gen.next(); // { value: 2, done: false }
每次遇到 yield,函数暂停,返回当前值;下次调用 next() 再继续。这使得我们可以用同步写法实现异步逻辑,或者创建无限序列。
迭代器与生成器的实际用途
生成器让创建自定义迭代逻辑变得简单。比如生成斐波那契数列:
function* fibonacci() {
let a = 0, b = 1;
while (true) {
yield a;
[a, b] = [b, a + b];
}
}
const fib = fibonacci();
fib.next().value; // 0
fib.next().value; // 1
fib.next().value; // 1
fib.next().value; // 2
这种写法简洁又高效,不需要预先计算所有值。此外,生成器曾被广泛用于异步编程(如配合 co 库),虽然现在已被 async/await 取代,但其“暂停-恢复”机制仍是理解现代异步流程的基础。
基本上就这些。迭代器提供统一遍历接口,生成器让创建迭代器变得轻松自然。掌握它们有助于写出更优雅、内存友好的代码。不复杂但容易忽略。









