第21天:迭代器
#javascript #100daysofcode #day21

ð¶什么是迭代器?

迭代器允许我们一次循环通过数据元素。它们提供了一种标准化的方式,可以访问集合中的元素,例如数组或地图,而无需揭露基础实现详细信息。

ð迭代器协议

在ES6(ECMASCRIPT 2015)之前,JavaScript中的数据结构迭代主要是使用for循环进行的。但是,随着迭代协议的引入,出现了一种更清洁,更通用的方法。

迭代器协议由两个基本组件组成:

  1. 迭代:具有迭代方法的对象。此方法返回一个迭代对象,使我们能够穿越集合。

  2. 迭代器:实现next()方法的对象。此方法返回一个具有两个属性的对象:代表当前元素的valuedone,一个布尔值,指示迭代是否完成。

ð使用迭代器

ð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 :生成器是一种特殊类型的迭代器,可让您暂停并恢复函数的执行。他们方便地以更可读和可维护的方式创建具有复杂逻辑的迭代器。