迭代器Iterator你了解多少呢?

「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」。

一、迭代器Iterator基本作用

  • 迭代器Iterator是一种接口机制,为各种不同的数据结构提供统一的访问机制
  • 主要就是供for...of..使用
  • 使数据结构的成员按照某种顺序排列
  • 用一句话总结就是:让不可迭代的数据结构变得可迭代

是不是对其充满好奇呢?下面就让我们一探究竟,到底是如何实现让不可迭代的数据结构变得可迭代的呢? 文章的最后一定会给我们答案。

二、原生具备Iterator接口的数据结构

  • Array
  • Set
  • Map
  • String
  • TypeArray:类似于数组的结构,对底层的二进制进行描述的一种数据结构
  • 函数的argiuments对象
  • NodeList对象

我们如何看一个数据结构是否具有Iterator接口呢?我们可以打印一个map,会发现map的原型下面有一个Symbol.iterator,这就说明Map是具有iterator接口的可遍历的数据结构。其它的我们也同样可以打印验证;

let map = new Map()
console.log(map);
复制代码

调用对应数据结构下面得Symbol.iterator方法

let map = new Map()
let foo = map[Symbol.iterator]()
console.log(foo.next()) //{value: undefined, done: true}
复制代码

WechatIMG46.png

下面得方法可以让我们判断某个对象是否可迭代

const isIterable = obj => obj != null && typeof obj[Symbol.iterator] === 'function';
复制代码

三、模拟一个遍历器

下面得代码是模拟实现一个遍历器,其中就有next()方法,我们可以发现,其实这和generator函数的next()是大差不差的。

carbon.png

四、可迭代协议和迭代器协议

可迭代协议和迭代器协议

我们通俗来理解,具有Symbol.iterator的就是遵循的可迭代协议。凡是按照next()调用这种就都可以称之为迭代器协议

我们将一段不可遍历的数据结构变得可遍历,代码如下:

carbon (1).png

其实上边的代码我们是可以用generator函数改造的,代码如下

carbon (2).png

五、iterator的遍历过程

Iterator 的遍历过程是这样的。

  1. 创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。
  2. 第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。
  3. 第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。
  4. 不断调用指针对象的next方法,直到它指向数据结构的结束位置。

每一次调用next方法,都会返回数据结构的当前成员的信息。具体来说,就是返回一个包含valuedone两个属性的对象。其中,value属性是当前成员的值,done属性是一个布尔值,表示遍历是否结束。

Guess you like

Origin juejin.im/post/7062972288873791524