资讯专栏INFORMATION COLUMN

ES6的Iterator对象详解

KoreyLee / 2328人阅读

摘要:实现原理创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。具体来说,就是返回一个包含和两个属性的对象。接口部署在对象的属性上可以调用这个属性,就得到遍历器对象。

Iterator实现原理

创建一个指针对象,指向当前数据结构的起始位置。也就是说,遍历器对象本质上,就是一个指针对象。

第一次调用指针对象的next方法,可以将指针指向数据结构的第一个成员。

第二次调用指针对象的next方法,指针就指向数据结构的第二个成员。

不断调用指针对象的next方法,直到它指向数据结构的结束位置。

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

ES6 里的迭代器并不是一种新的语法或者是新的内置对象(构造函数), 而是一种协议,所有遵循了这个协议的对象都可以称之为迭代器对象,所以说迭代器是一种协议,一个统一的接口标准,两个属性都不返回值也不会报错,但是不符合协议标准了,就不能称作迭代器了

如何部署Iterator接口

在ES6中,有三类数据结构原生具备Iterator接口:数组、某些类似数组的对象、Set和Map结构,对象(Object)之所以没有默认部署Iterator接口,是因为对象的哪个属性先遍历,哪个属性后遍历是不确定的,需要开发者手动指定。

Iterator接口部署在对象的Symbol.Iterator属性上, 可以调用这个属性,就得到遍历器对象。

     var arr = ["a", "b", "c"];
     var iterator = arr[Symbol.iterator]();
     var a = iterator.next();
     console.log(a)   //{value: "a", done: false}
for--of与for--in

for...in 遍历每一个属性名称,而 for...of遍历每一个属性值。

在对象没有部署Iterator接口的情况下调用for...of会报错。当一个部署了Iterator接口的对象调用for...of时,
实现的步骤是这样的:

调用对象的Symbol.Iterator的属性获得遍历器生成函数;

调用遍历器生成函数返回遍历器对象
其实for...of就相当于一直调用遍历器对象的next方法,直到返回done为true;

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79715.html

相关文章

  • ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解

    摘要:变量声明与赋值值传递浅拷贝与深拷贝详解归纳于笔者的现代开发语法基础与实践技巧系列文章。变量声明在中,基本的变量声明可以用方式允许省略,直接对未声明的变量赋值。按值传递中函数的形参是被调用时所传实参的副本。 ES6 变量声明与赋值:值传递、浅拷贝与深拷贝详解归纳于笔者的现代 JavaScript 开发:语法基础与实践技巧系列文章。本文首先介绍 ES6 中常用的三种变量声明方式,然后讨论了...

    snowLu 评论0 收藏0
  • ES6】迭代器与可迭代对象

    摘要:通过生成器创建的迭代器也是可迭代对象,因为生成器默认会为属性赋值。我们可以用来访问对象的默认迭代器,例如对于一个数组获得了数组这个可迭代对象的默认迭代器,并操作它遍历了数组中的元素。 ES6 新的数组方法、集合、for-of 循环、展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现。本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方法 ...

    terasum 评论0 收藏0
  • es6 Generators详解

    摘要:每个任务必须显式地挂起自己,在任务切换发生时给予它完全的控制。在这些尝试中,数据经常在任务之间共享。但由于明确的暂停,几乎没有风险。 翻译自 github 概述 什么是generators? 我们可以把generators理解成一段可以暂停并重新开始执行的函数 function* genFunc() { // (A) console.log(First); yi...

    zhaot 评论0 收藏0
  • ES6中Array.from()函数详解

    摘要:注意属性名代表了数组的索引号,如果没有这个索引号,转出来的数组中对应的元素就为空。对象的属性名不能转换成索引号时。可选参数可选参数,执行回调函数时对象。 ES6为Array增加了from函数用来从一个类似数组或可迭代对象中创建一个新的,浅拷贝的数组实例。不过只可以将一下两种对象转换成数组。1.部署了Iterator接口的对象,比如:Set,Map,Array。2.类数组对象,什么叫类数...

    zzzmh 评论0 收藏0
  • ES6语法详解(一)

    摘要:冻结对象可以使用方法。对象的解构赋值必须要属性名相同,顺序毫无影响。数组解构赋值默认值,当等号右边的值时,默认值生效。 let变量 let声明的变量在let命令所在的代码块中有效。不存在变量提升,只能先声明后使用。 暂存死区 如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量。 var a = 1; { ...

    wendux 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<