ð¶什么是迭代器?
迭代器允许我们一次循环通过数据元素。它们提供了一种标准化的方式,可以访问集合中的元素,例如数组或地图,而无需揭露基础实现详细信息。
ð迭代器协议
在ES6(ECMASCRIPT 2015)之前,JavaScript中的数据结构迭代主要是使用for
循环进行的。但是,随着迭代协议的引入,出现了一种更清洁,更通用的方法。
迭代器协议由两个基本组件组成:
-
迭代:具有迭代方法的对象。此方法返回一个迭代对象,使我们能够穿越集合。
-
迭代器:实现
next()
方法的对象。此方法返回一个具有两个属性的对象:代表当前元素的value
和done
,一个布尔值,指示迭代是否完成。
ð使用迭代器
ðfor...of
循环
for...of
循环是ES6出现的方便功能,使其更容易与迭代器一起使用。让我们看看它如何与数组一起工作:
const fruits = ['🍎', '🍌', '🍇', '🍊', '🍓'];
for (const fruit of fruits) {
console.log(fruit);
}
在这里,for...of
循环使用fruits
数组的迭代器自动处理迭代过程。
ð - 创建自定义迭代器
我们还可以为自己的对象定义自定义迭代器。为此,我们需要在我们的对象上实现迭代器协议。
const range = {
start: 1,
end: 5,
[Symbol.iterator]() {
let currentValue = this.start;
return {
next: () => {
if (currentValue <= this.end) {
return { value: currentValue++, done: false };
} else {
return { done: true };
}
},
};
},
};
for (const num of range) {
console.log(num);
}
此代码将从1到5输出数字,以说明我们如何定义自定义迭代行为。
内置的迭代器ð
JavaScript提供了几种可观的内置数据结构,包括数组,字符串,地图,集合等。我们可以将这些结构与for...of
循环或任何其他迭代器的方法一起使用。
ðÖ迭代在字符串上
const message = "Hello, Dev.to! 🚀";
for (const char of message) {
console.log(char);
}
ð°在地图上迭代
const myMap = new Map([
['key1', 'value1'],
['key2', 'value2'],
['key3', 'value3'],
]);
for (const [key, value] of myMap) {
console.log(`${key} => ${value}`);
}
- 使用迭代器的优势
- 自定义迭代行为:使用迭代器,您可以为对象定义自定义迭代行为。这种灵活性使您可以以最有意义的特定用例来循环数据结构。
-
异步迭代:ES6引入了异步迭代器(
Symbol.asyncIterator
),在处理异步操作和流时,它们是无价的。它们可以优雅地处理异步数据。 - 懒惰评估:迭代器促进懒惰评估,其中仅在需要时生成下一个值。在处理大型数据集时,这可能特别有用,因为它可以最大程度地减少内存消耗。
- Generator :生成器是一种特殊类型的迭代器,可让您暂停并恢复函数的执行。他们方便地以更可读和可维护的方式创建具有复杂逻辑的迭代器。