返回

JavaScript高级程序设计(第4版)的迭代器:深入浅出

前端

写在前面

对于初学者而言,《JavaScript 高级程序设计》(以下简称“高程4”)是一本不可多得的经典教程。本书自2006年问世以来,便广受开发者的青睐,如今已更新至第四版。相比于第三版,高程4不仅增加了ES6至ES10的全新内容,还删除了过时的部分,并充实了更多翔实的内容。其中,“迭代器”这一概念,是高程4新增的重要内容之一。

什么是迭代器?

简单来说,迭代器是一个对象,它提供了一种遍历集合中元素的机制。它通过next()方法来获取集合中的元素,直到返回done属性为true,表示集合中没有更多元素可供遍历。

高程4中的迭代器

高程4中提供了丰富的迭代器API,包括Array.prototype.entries()、Array.prototype.keys()、Array.prototype.values()、Set.prototype.entries()、Set.prototype.keys()、Set.prototype.values()、Map.prototype.entries()、Map.prototype.keys()和Map.prototype.values()。这些API返回一个迭代器对象,可以通过next()方法遍历集合中的元素。

迭代器的使用

使用迭代器非常简单,只需要调用next()方法即可。next()方法返回一个对象,该对象包含两个属性:value和done。value属性是集合中的当前元素,done属性表示是否遍历完成。

for...of循环

for...of循环是遍历集合的另一种便捷方式。它会自动创建一个迭代器,并依次遍历集合中的元素。

const arr = [1, 2, 3, 4, 5];

for (const item of arr) {
  console.log(item); // 输出:1 2 3 4 5
}

Symbol.iterator

Symbol.iterator是一个特殊的符号,它表示一个对象是否可以被迭代。当一个对象实现了Symbol.iterator方法时,它就会成为一个可迭代对象。

class MyIterable {
  *[Symbol.iterator]() {
    yield 1;
    yield 2;
    yield 3;
  }
}

const iterable = new MyIterable();

for (const item of iterable) {
  console.log(item); // 输出:1 2 3
}

Generator函数

Generator函数是一个特殊的函数,它可以生成一个序列。它通过yield来实现,yield关键字表示生成器的暂停点。

function* generateSequence(start, end) {
  for (let i = start; i <= end; i++) {
    yield i;
  }
}

const generator = generateSequence(1, 5);

for (const item of generator) {
  console.log(item); // 输出:1 2 3 4 5
}

自定义迭代器

除了使用内置的迭代器API之外,我们还可以自定义自己的迭代器。只需要实现Symbol.iterator方法即可。

class MyIterable {
  constructor(items) {
    this.items = items;
    this.index = 0;
  }

  [Symbol.iterator]() {
    return {
      next: () => {
        if (this.index < this.items.length) {
          return { value: this.items[this.index++], done: false };
        } else {
          return { value: undefined, done: true };
        }
      }
    };
  }
}

const iterable = new MyIterable([1, 2, 3, 4, 5]);

for (const item of iterable) {
  console.log(item); // 输出:1 2 3 4 5
}

总结

迭代器是JavaScript中一种强大的机制,它可以让我们轻松遍历集合中的元素。高程4提供了丰富的迭代器API,我们可以使用这些API来遍历集合。此外,我们还可以使用for...of循环、Generator函数和自定义迭代器来实现集合的遍历。