关键词:iterator 对象、iterator 和 数组关系

在 JavaScript 中,Iterator(迭代器)和数组有着密切的关系:

一、数组作为可迭代对象

  1. 可在迭代场景中使用

    • 数组是一种内置的可迭代对象,这意味着它可以在需要可迭代对象的地方使用,比如在for...of循环、扩展运算符(...)和Array.from()等方法中。
    • 例如:
     1const arr = [1, 2, 3];
     2for (const item of arr) {
     3  console.log(item);
     4}
  2. 实现了迭代协议

    • 数组实现了可迭代对象的协议,即拥有一个Symbol.iterator方法。这个方法返回一个 Iterator 对象,用于遍历数组的元素。

二、Iterator 用于遍历数组

  1. 提供遍历机制

    • Iterator 对象为数组的遍历提供了一种标准化的方式。通过调用数组的Symbol.iterator方法获取 Iterator 对象,然后可以使用next()方法逐个访问数组的元素。
    • 例如:
     1const arr = [4, 5, 6];
     2const iterator = arr[Symbol.iterator]();
     3let result = iterator.next();
     4while (!result.done) {
     5  console.log(result.value);
     6  result = iterator.next();
     7}
  2. 灵活的迭代控制

    • 使用 Iterator 对象可以更灵活地控制数组的遍历过程。可以在遍历过程中暂停、恢复或根据特定条件进行遍历。
    • 例如,可以实现一个自定义的迭代器,只遍历数组中的偶数元素:
     1function evenNumberIterator(arr) {
     2  let index = 0;
     3  return {
     4    next() {
     5      while (index < arr.length) {
     6        const value = arr[index];
     7        index++;
     8        if (value % 2 === 0) {
     9          return { value, done: false };
    10        }
    11      }
    12      return { done: true };
    13    },
    14  };
    15}
    16
    17const arr = [1, 2, 3, 4, 5, 6];
    18const iterator = evenNumberIterator(arr);
    19let result = iterator.next();
    20while (!result.done) {
    21  console.log(result.value);
    22  result = iterator.next();
    23}

三、数组方法与 Iterator 的关系

  1. 某些数组方法利用 Iterator

    • 一些数组方法,如forEach()map()filter()等,内部实际上是使用 Iterator 来遍历数组的元素。
    • 例如,map()方法创建一个新数组,其中每个元素都是对原始数组中对应元素调用提供的函数的结果:
     1const arr = [7, 8, 9];
     2const newArr = arr.map((item) => item * 2);
     3console.log(newArr);
  2. 可迭代性的扩展

    • 通过利用 Iterator,可以为数组定义自定义的迭代行为。例如,可以创建一个自定义的类,该类的实例是可迭代的,并且可以像数组一样进行遍历。
    • 例如:
     1class CustomArray {
     2  constructor() {
     3    this.data = [];
     4  }
     5
     6  add(item) {
     7    this.data.push(item);
     8  }
     9
    10  *[Symbol.iterator]() {
    11    for (const item of this.data) {
    12      yield item;
    13    }
    14  }
    15}
    16
    17const customArr = new CustomArray();
    18customArr.add(10);
    19customArr.add(11);
    20customArr.add(12);
    21
    22for (const item of customArr) {
    23  console.log(item);
    24}

总之,Iterator 和数组在 JavaScript 中紧密相关。数组作为可迭代对象,可以通过 Iterator 进行遍历,而 Iterator 为数组的遍历提供了灵活的控制和扩展机制。这种关系使得在处理数组和其他可迭代对象时,可以使用统一的迭代模式和方法。

个人笔记记录 2021 ~ 2025