javascript迭代器协议要求可迭代对象提供symbol.iterator方法,返回新迭代器;迭代器必须实现next()方法,返回{value, done}对象,done为true后持续返回{value: undefined, done: true}。

JavaScript 中迭代器协议通过一套明确的接口约定,让任何对象都能以统一方式被遍历,关键不在于数据怎么存,而在于它“怎么交出值”。
可迭代对象必须提供 Symbol.iterator 方法
一个对象要能被 for...of、扩展运算符([...obj])或解构赋值消费,就必须在自身或原型链上拥有 Symbol.iterator 属性。这个属性必须是一个无参函数,且每次调用都返回一个新的迭代器对象。
- 不能是普通值,比如
Symbol.iterator: null不合法 - 不能返回固定状态的迭代器(否则多次遍历会相互干扰)
- 数组、字符串、Map、Set 等内置类型已原生实现该方法
迭代器对象必须实现 next() 方法
Symbol.iterator() 返回的对象,就是迭代器。它必须有一个 next() 方法,每次调用返回形如 { value, done } 的对象:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
value:当前产出的值,类型任意(包括
undefined) -
done:布尔值,
false表示还有值;true表示遍历结束 - 一旦
done为true,后续调用应持续返回{ value: undefined, done: true } - 哪怕
value是undefined,只要done是false,就表示还没完
协议让遍历行为与数据结构解耦
协议不规定数据如何组织,只规定“怎么取下一个”。这意味着:
- 你可以让普通对象支持
for...of,只需手动添加[Symbol.iterator]() - 可以用生成器函数(
*[Symbol.iterator]())自动构造合规迭代器,逻辑更清晰 - 无限序列(如自然数、斐波那契)也能安全遍历——因为值是按需生成,不是一次性加载
- 异步数据源可通过
Symbol.asyncIterator延伸同一套思路,用for await...of
实际写法要注意状态隔离和语义清晰
自定义时容易忽略两点:一是每次 [Symbol.iterator] 调用应返回独立迭代器实例;二是 next() 的逻辑要准确反映“是否还有值”的语义。
- 错误示例:把计数器定义在对象顶层,导致多次遍历共享状态
- 推荐做法:把当前状态(如
current)封在闭包或迭代器对象内部 - 边界判断要严谨,比如
current 比 <code>current !== end更不易出错
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










