JavaScript 迭代器

201 阅读2分钟

这是我参与8月更文挑战的第27天,活动详情查看:8月更文挑战

前言

吃饱饭才有力气写代码~

今天学习一下JavaScript的迭代器相关知识。

理解迭代

首先先来理解一下迭代,在JavaScript中最简单的迭代:

for (let i = 1;i <= 10;i++){
    console.log(i);
}

循环是迭代机制的基础,它可以指定迭代的次数,以及每次迭代要执行的操作。
迭代会在一个有序集合上进行,所谓有序可以理解为集合中的所有项都可以按照既定的顺序被遍历到,特别是开始项和结束项有明确的定义。比如数组:

let arr = ['aaa','bbb','ccc'];
for (let index = 0;index < arr.length; ++index){
    console.log(arr[index]);
}

因为数组有已知的长度,且数组每一项都可以通过索引获得,所以整个数组可以通过递增索引来遍历。但是这种循环来执行例程并不理想。原因如下:

  • 迭代之前需要事先知道如何使用数据结构
  • 遍历顺序并不是数据结构固有的

在早期的版本中,执行迭代必须使用循环或者其它辅助结构。随着代码量的增加,代码会越来越混乱,后来的解决方案就是迭代器模式

迭代器模式

迭代器模式描述了一个方案,即可以把有些结构称为可迭代对象,因为它们实现了正式的Iterable,而且可以通过迭代器Iterator消费。
基本上可以把可迭代对象理解成数组或集合这样的集合类型的对象。它们的元素都是有限的,而且都具有无歧义的遍历顺序。

//数组的元素是有限的
//递增索引可以按序访问每个元素
let arr = [3,2,1];
//集合的元素是有限的
//可以按插入顺序访问每个元素
let set = new Set().add(3).add(2).add(1);

不过,可迭代对象不一定是集合对象,也可以是仅仅具有类似数组行为的其他数据结构。比如最开始的那个计数循环,在那个循环中生成的值是暂时的,但循环本身是在执行迭代,计数循环和数组都具有可迭代对象的行为。
突然fa