Iterator:访问数据集合的统一接口

导语

遍历器 是 ES6 为访问数据集合提供的统一接口。任何内部部署了遍历器接口的数据集合,对于用户来说,都可以使用相同方式获取到相应的数据结构。如果使用的是最新版 浏览器,那么你要知道——我们所熟悉的数组小姐,已悄悄的打开了另一扇可抵达她心扉的小径。

1 正题

某个数据集合部署了 接口,是指其 属性指向一个能返回 接口的函数。任何默认使用遍历器访问数据集合的方法,都会调用此属性以得到遍历器对象,再按照设定的顺序依次访问该数据结构的成员(关于 请看最后一节的延伸阅读)。比如原生数组的遍历器为 ,也可以直接通过其构造函数的原型获取 。

1.1 基本行为

调用 接口会返回一个新的遍历器对象(指针对象)。 对象中必然有 方法,用于访问下一个数据成员。指针初始时指向当前数据结构的起始位置。

第一次调用对象的 方法,指针指向数据结构的第一个成员。 第二次调用对象的 方法,指针指向数据结构的第二个成员。 不断的调用对象的 方法,直到它指向数据结构的结束位置。

每次调用 方法,都会返回相同的数据结构: 。 其中 表示当前指向成员的值,没有则为 。 其中 是一个布尔值,表示遍历是否结束,结束为 ,否则 。

遍历器接口的标准十分简洁,不提供诸如:操作内部指针、判断是否有值等等方法。只需要一直不断的调用 方法,当 为 时获取当时的 , 为 时停止即可。第一次接触遍历器的行为模式是在 2016 的冬天,那时底蕴不够鸡毛也没长全,理解不了简洁性的适用和强大。直到现在——在即将打包被迫离开公司的前夕才蓦然的醒觉。多么痛的领悟啊。

1.2 简单实现

面向不同的数据结构,有不同的遍历器实现方法,我们简单的实现下数组的遍历器方法。

1.3 return & throw

除了为遍历器对象部署 方法,还可以有 和 方法。其中 方法会在提前退出 循环时(通常是因为出错,或触发了 语句)被调用。而 方法主要是配合 函数使用,一般的遍历器对象用不到这个方法,所以不予介绍。

2 原生支持

2.1 默认持有遍历器

原生默认持有遍历器接口的数据结构有: 基本类型: , , (四种基本数据集合: , , 和 )。 类数组对象: , , 。

遍历器与先前的遍历方法一个数据集合拥有遍历器接口,并不意味着所有遍历它的方法都是使用此接口。实际上,只有 ES6 新增的几种方式和某些方法会使用,下面会有介绍。以数组来说,对其使用 和 虽然可访问到相同的成员,但是实际的操作方式却不同。

对象没有默认的遍历器接口为什么对象没有默认的遍历器接口?这要从两方面说明。一为遍历器是种线性处理结构,对于任何非线性的数据结构,部署了遍历器接口,就等于部署一种线性转换。二是对象本来就是一个无序的集合,如果希望其有序,可以使用 代替。这即是各有其长,各安其职。屎壳郎如果不滚粪球而去采蜜,那,呃,花妹妹可能就遭殃咯。

为对象添加遍历器接口,也不影响之前不使用遍历器的方法,比如 , 等等(两者不等同)。

2.2 默认调用遍历器

for of是专门用来消费遍历器的,其遍历的是键值( 遍历的是键名)。

扩展运算符无论是解构赋值或扩展运算都是默认调用遍历器的。

yield* 在 函数中有 命令,如果其后面跟的是一个可遍历的结构,它会调用该结构的遍历器接口。

其它场合有些接受数组作为参数的函数,会默认使用数组的遍历器接口,所以也等同于默认调用。比如 , 。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180730A0FV6300?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券