JavaScript 的迭代器(Iterator)是一个对象,它提供了一种机制来遍历集合(如数组、字符串、Map、Set 等)。迭代器对象实现了一个 next
方法,每次调用该方法会返回一个包含两个属性的对象:value
和 done
。
迭代器的基本概念
迭代器对象:实现了
next
方法的对象。next
方法:返回一个对象,该对象包含两个属性:value
:当前迭代的值。done
:一个布尔值,表示迭代是否完成。
创建迭代器
你可以通过实现一个对象的 next
方法来创建一个迭代器。
function createIterator(array) {
let index = 0;
return {
next: function() {
if (index < array.length) {
return { value: array[index++], done: false };
} else {
return { value: undefined, done: true };
}
}
};
}
const iterator = createIterator([1, 2, 3]);
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
内置迭代器
JavaScript 的一些内置对象(如数组、字符串、Map、Set 等)已经实现了迭代器接口,可以直接使用。
const array = [1, 2, 3];
const iterator = array[Symbol.iterator]();
console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }
for...of
循环
for...of
循环是遍历可迭代对象的简便方法,它会自动调用迭代器的 next
方法。
const array = [1, 2, 3];
for (const value of array) {
console.log(value); // 依次输出 1, 2, 3
}
生成器(Generators)
生成器是创建迭代器的更简便方法。生成器函数使用 function*
语法定义,并使用 yield
关键字生成值。
function* createGenerator() {
yield 1;
yield 2;
yield 3;
}
const generator = createGenerator();
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
自定义可迭代对象
你可以通过实现 Symbol.iterator
方法来自定义可迭代对象。
const myIterable = {
*[Symbol.iterator]() {
yield 1;
yield 2;
yield 3;
}
};
for (const value of myIterable) {
console.log(value); // 依次输出 1, 2, 3
}
总结
迭代器提供了一种统一的方式来遍历集合,生成器则提供了一种简便的方法来创建迭代器。通过理解和使用迭代器和生成器,可以编写更简洁和高效的代码来处理各种集合。