javascript中iterator协议的核心是实现[symbol.iterator]()方法并返回含next()的对象;分两层:可迭代协议要求对象有symbol.iterator方法,迭代器协议要求返回对象有next()方法并返回{value, done}。

JavaScript 中的 Iterator 迭代器协议,核心是让一个对象能被 for...of、展开运算符([...obj])、解构赋值等语法遍历,关键在于实现 [Symbol.iterator]() 方法,并返回一个符合迭代器协议的对象(即有 next() 方法)。
迭代器协议的两个层级
迭代器协议分两层:
-
可迭代协议(Iterable Protocol):对象必须有
Symbol.iterator方法,该方法返回一个迭代器对象。 -
迭代器协议(Iterator Protocol):返回的对象必须有
next()方法,每次调用返回形如{ value: any, done: boolean }的对象。
手动实现一个简单迭代器
例如,实现一个从 start 到 end(含)的数字范围迭代器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
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, 5
}
console.log([...range(1, 3)]); // [1, 2, 3]
使用生成器函数简化实现
生成器函数(function*)天然符合迭代器协议,yield 会自动封装成 {value, done},更简洁安全:
function* rangeGen(start, end) {
for (let i = start; i const iter = rangeGen(10, 12);
console.log(iter.next()); // { value: 10, done: false }
console.log(iter.next()); // { value: 11, done: false }
console.log(iter.next()); // { value: 12, done: false }
console.log(iter.next()); // { value: undefined, done: true }<p>// 也可直接用于 for...of
for (const x of rangeGen(1, 2)) {
console.log(x); // 1, 2
}
</p>
常见调用方式与注意事项
只要对象实现了可迭代协议,就能被以下方式消费:
for (const v of iterable) { ... }-
[...iterable](数组展开) Array.from(iterable)-
new Set(iterable)、new Map([[k,v], ...])等构造器 - 解构:
const [a, b] = iterable;
注意:普通对象({})默认不实现 [Symbol.iterator],所以不能直接 for...of;若需遍历其键/值/项,应显式使用 Object.keys(obj)、Object.values(obj) 或 Object.entries(obj),它们返回的是已实现迭代器的数组。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










