javascript自定义迭代器需实现[symbol.iterator]()方法并返回含next()的对象,next()每次返回{value, done};生成器函数可简化实现,如class countdown中用*[symbol.iterator]()自动返回合规迭代器。

JavaScript 中自定义迭代器,核心是让对象拥有 [Symbol.iterator]() 方法,并返回一个符合迭代器协议的对象(即有 next() 方法,每次调用返回 { value, done } 形式的对象)。
迭代器协议的关键结构
一个合法的迭代器对象必须满足:
-
next()是一个无参函数(或只接受一个可选参数,如 for-await-of 中的 yield) - 每次调用
next()返回一个对象,包含value(当前产出值)和done(布尔值,表示是否遍历结束) - 当
done: true后,后续调用next()应始终返回{ value: undefined, done: true }
手动实现一个简单数字范围迭代器
比如实现一个类似 Python 的 range(start, end),支持 for...of:
function range(start, end) {
return {
[Symbol.iterator]() {
let current = start;
return {
next() {
if (current // 使用
for (const n of range(2, 5)) {
console.log(n); // 2, 3, 4
}
用生成器函数更简洁地实现(推荐)
生成器函数(function*)会自动返回符合协议的迭代器,语义清晰、状态管理自然:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
function* range(start, end) {
for (let i = start; i // 完全等价,且自带 return()/throw() 支持
for (const n of range(2, 5)) {
console.log(n); // 2, 3, 4
}
生成器内部维护执行上下文和暂停/恢复状态,比手写 next() 更安全、易读、可扩展(例如支持异步迭代需用 async function* 和 yield*)。
为类添加自定义迭代行为
给自定义类添加 [Symbol.iterator],就能让它被 for...of、展开运算符、解构等原生语法识别:
class Countdown {
constructor(n) {
this.n = n;
}
*[Symbol.iterator]() {
for (let i = this.n; i > 0; i--) {
yield i;
}
}
}
<p>const cd = new Countdown(3);
console.log([...cd]); // [3, 2, 1]
for (const x of cd) console.log(x); // 3 → 2 → 1</p>
注意:类中方法名写成 *[Symbol.iterator]() 即可,无需额外 return 迭代器对象 —— 生成器函数调用后自动返回迭代器。
不复杂但容易忽略:只要对象有 [Symbol.iterator] 方法并返回合规迭代器,它就是“可迭代的”。手写适合理解原理,实际开发优先用生成器,兼顾简洁与健壮性。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










