JavaScript迭代器通过Symbol.iterator接口统一遍历逻辑,内置类型默认实现该方法,普通对象需手动添加返回符合迭代器协议对象的方法,生成器函数是实现自定义迭代最简洁的方式。

JavaScript 中迭代器通过统一的 Symbol.iterator 接口,让数组、字符串、Map、Set 甚至自定义对象都能用相同的 for...of 语法遍历,核心在于“谁提供迭代逻辑,谁实现这个方法”。
所有可迭代对象都必须有 [Symbol.iterator] 方法
只要一个对象的原型链上或自身拥有名为 Symbol.iterator 的方法,且该方法返回一个符合迭代器协议的对象(即有 next() 方法),它就能被 for...of、扩展运算符、解构等识别为可迭代对象。
- 数组、字符串、Map、Set 等内置类型默认实现了该方法,所以能直接遍历
-
typeof [1,2,3][Symbol.iterator] === 'function'返回true - 普通对象(如
{a:1, b:2})默认没有这个方法,因此不能直接for...of
手动让普通对象支持遍历
给对象添加 [Symbol.iterator] 方法,返回一个迭代器对象即可。这个迭代器对象每次调用 next() 应返回 { value, done } 形式的对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 例如让对象按属性值遍历:
const obj = { x: 10, y: 20, z: 30 }; obj[Symbol.iterator] = function*() { for (let value of Object.values(this)) { yield value; } }; - 之后就能
for (const v of obj) console.log(v);输出 10、20、30 - 也可以不依赖生成器函数,手动返回带
next()的对象,但更繁琐
迭代器协议与生成器函数天然契合
生成器函数(function*)返回的生成器对象,本身就满足迭代器协议:它有 next() 方法,且能暂停/恢复执行。因此它是实现自定义迭代逻辑最简洁的方式。
立即学习“Java免费学习笔记(深入)”;
function* range(start, end) { for (let i = start; ifor (const n of range(1, 4)) console.log(n); // 1, 2, 3- 生成器内部逻辑可以任意复杂(异步、条件、嵌套),外部调用方式始终一致
统一遍历带来的实际好处
不关心数据底层结构,只认接口,让工具函数和语法糖更通用。
-
[...iterable]可用于任何可迭代对象,不用判断是数组还是 Set -
Array.from(iterable)同样适用,比如Array.from("abc")→["a","b","c"] - 写一个通用的
toArray工具函数,只需检查并调用[Symbol.iterator],无需为每种类型写分支

















