JavaScript迭代器是统一遍历接口,通过next()返回{value, done}对象;手动实现需提供符合规范的Symbol.iterator方法;生成器函数用yield简化迭代器创建。

JavaScript 迭代器(Iterator)是一种统一的遍历接口,它让不同数据结构(如数组、Map、Set、字符串等)能用相同方式被逐个访问元素。核心是实现 next() 方法,返回形如 { value: 当前值, done: 是否结束 } 的对象。
迭代器的基本结构和手动创建
一个对象只要拥有符合规范的 Symbol.iterator 方法,并返回一个带有 next() 方法的对象,就是可迭代的。你可以手动构造一个简单迭代器:
- 定义一个函数,内部维护索引和数据源
- 返回对象,其 [Symbol.iterator]() 返回一个对象
- 该对象的 next() 每次调用返回下一个 {value, done}
例如,为普通数组封装一个只返回偶数索引元素的迭代器:
const evenIndexIterator = arr => ({[Symbol.iterator]() {
let i = 0;
return {
next() {
if (i const val = arr[i];
i += 2;
return { value: val, done: false };
}
return { value: undefined, done: true };
}
};
}
});
哪些内置类型默认支持迭代?
以下类型原生具备 Symbol.iterator,可直接用于 for...of、扩展运算符(...)、解构等:
立即学习“Java免费学习笔记(深入)”;
技术上面应用了三层结构,AJAX框架,URL重写等基础的开发。并用了动软的代码生成器及数据访问类,加进了一些自己用到的小功能,算是整理了一些自己的操作类。系统设计上面说不出用什么模式,大体设计是后台分两级分类,设置好一级之后,再设置二级并选择栏目类型,如内容,列表,上传文件,新窗口等。这样就可以生成无限多个二级分类,也就是网站栏目。对于扩展性来说,如果有新的需求可以直接加一个栏目类型并新加功能操作
- Array:按索引顺序遍历元素
- String:按 Unicode 码点(非字节)遍历字符
- Map:遍历 [key, value] 数组(保持插入顺序)
- Set:遍历唯一值(保持插入顺序)
- TypedArray(如 Uint8Array):遍历数值元素
- arguments 对象 和 NodeList(DOM 集合)在现代环境中也支持
如何实际遍历?常用语法和注意事项
有了迭代器,你不需要手动调用 next(),JavaScript 提供了更简洁的消费方式:
- for...of 循环:最常用,自动调用迭代器并处理 done
-
扩展运算符 ...:如
[...mySet]转成数组 -
解构赋值:如
const [a, b] = new Set([1,2]) - Array.from():可转换任意可迭代对象为数组,支持映射回调
注意:Object 默认不可迭代。想遍历对象属性,需用 Object.keys(obj)、Object.entries(obj) 等先转成数组,或手动添加 Symbol.iterator。
生成器函数:更优雅的迭代器写法
function* 声明的生成器函数会自动返回一个迭代器对象,用 yield 暂停并产出值,极大简化复杂迭代逻辑:
function* countdown(n) {while (n > 0) {
yield n;
n--;
}
}
for (const num of countdown(3)) console.log(num); // 3, 2, 1
生成器还能配合 yield* 委托其他可迭代对象,适合组合多个数据源。










