JavaScript迭代协议通过Symbol.iterator让对象可迭代,实现该方法并返回带next()的迭代器对象,即可用for...of或展开运算符遍历;生成器函数(function*)配合yield能更简洁地创建迭代器,自动管理状态与next()逻辑,提升代码可读性与灵活性。

JavaScript中的迭代协议,说白了,就是一套约定,它让任何对象都能定义自己的遍历行为。核心在于实现一个特定的方法:
[Symbol.iterator]
for...of
...
要让一个JavaScript对象变得可迭代,你需要给它添加一个名为
[Symbol.iterator]
那么,什么是迭代器呢?迭代器本身也是一个对象,它必须包含一个
next()
next()
value
done
done
true
false
举个例子,假设我们想创建一个简单的计数器,让它能从某个数字开始,数到另一个数字:
function createCounter(start, end) {
let current = start;
return {
[Symbol.iterator]() { // 这就是可迭代协议的关键
return { // 返回一个迭代器对象
next() { // 迭代器对象必须有next方法
if (current <= end) {
return { value: current++, done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
};
}
const myCounter = createCounter(1, 3);
for (const num of myCounter) {
console.log(num); // 输出 1, 2, 3
}
// 也可以用展开运算符
const numsArray = [...createCounter(5, 7)];
console.log(numsArray); // 输出 [5, 6, 7]这里可以看到,
createCounter
[Symbol.iterator]
[Symbol.iterator]
next()
for...of
for...of
for (const item of someIterableObject)
它会首先尝试调用
someIterableObject
[Symbol.iterator]()
如果成功获取到迭代器,
for...of
next()
next()
done
done
false
value
item
done
true
for...of
这与传统的
for...in
for...in
for...of
for...of
手动实现迭代器的
next()
生成器函数使用
function*
yield
yield
value
done
false
next()
yield
yield
done
true
这意味着,一个生成器函数本身在被调用时,就会返回一个迭代器对象,这个对象已经自动实现了
next()
[Symbol.iterator]
// 还是那个计数器,用生成器函数实现
function createCounterWithGenerator(start, end) {
return {
[Symbol.iterator]: function* () { // [Symbol.iterator] 现在是一个生成器函数
for (let i = start; i <= end; i++) {
yield i; // 每次yield一个值,就会暂停并返回
}
}
};
}
const myGenCounter = createCounterWithGenerator(10, 12);
for (const num of myGenCounter) {
console.log(num); // 输出 10, 11, 12
}
// 或者更直接地,生成器函数本身就是迭代器
function* simpleGenerator() {
yield 'Hello';
yield 'World';
yield '!';
}
const gen = simpleGenerator(); // 调用生成器函数直接返回一个迭代器
console.log(gen.next()); // { value: 'Hello', done: false }
console.log(gen.next()); // { value: 'World', done: false }
console.log(gen.next()); // { value: '!', done: false }
console.log(gen.next()); // { value: undefined, done: true }
// 甚至可以直接用for...of遍历生成器函数返回的迭代器
for (const item of simpleGenerator()) {
console.log(item); // 输出 Hello, World, !
}在我看来,生成器函数简直是迭代器协议的“最佳拍档”。它把复杂的迭代逻辑,特别是那些需要维护内部状态的遍历,用一种更接近同步代码的直观方式表达出来。你不再需要手动管理
value
done
yield
以上就是JS如何实现迭代协议?可迭代对象的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号