手机版

解释易于理解的指南和ES6迭代器的例子

时间:2021-08-20 来源:互联网 编辑:宝哥软件园 浏览:

本文的目的是分析和理解迭代器。迭代器是JS中的一种新方法,可以用来循环任意集合。ES6中出现的迭代器。因为它可以被广泛使用,并且已经在很多场景中使用,所以我们将从概念上理解什么是迭代器,以及在哪里使用迭代器和示例。我们还将在JS中看到它的一些实现。

简介

假设有这样一个数组

const my avouriteauthors=[' Neal Stephenson ',' Arthur Clarke ','艾萨克阿西莫夫',' Robert海因莱茵'];在某些情况下,您希望返回数组中的所有单个值,以便可以在屏幕上打印它们、操纵它们或对它们执行一些操作。

怎么处理?一个简单的方法是使用for、while、for-of方法。

如下所示:

现在,假设您有一个自定义数据结构来保存所有作者

MyFavouriteAuthors是一个包含另一个对象allAuthors的对象。所有作者包含三个数组,包括小说、科学小说和幻想。

现在,如果你被要求循环访问我的博客作者以获得所有作者,你的方法是什么?你可以尝试一些循环组合来获得所有的数据。

但是如果你这样做,——

For(让myfavouriteauthors的作者){console.log(作者)}//typeerror: {}不可重复。您将获得一个类型错误,指示对象无法迭代。让我们看看什么是迭代,以及如何使对象迭代。

可迭代对象和迭代器(可迭代对象和迭代器)

我在最后一节看到一个问题。从我们的定制对象中获取所有作者并不容易。我们需要一种有序获取内部数据的方法。

我们在myFavouriteAuthors中添加了一个方法getAllAuthors,返回所有作者。例如:

这是一个简单的方法。它帮助我们完成获取所有作者的功能。但是,这种实现可能会有一些问题:

getAllAuthors的名字非常具体。如果其他人正在创建他们自己的myFavouriteAuthors,他们可能会将其命名为retrieveAllAuthors。作为开发人员,我们总是需要知道返回所有数据的具体方法,在这个例子中被命名为getAllAuthors。GetAllAuthors返回一个字符串数组。如果另一个开发人员返回这种格式的对象数组,我该怎么办:[{name:' agatha Christie'},{name3360' j.k. Rowling'},]开发人员必须知道返回所有数据的方法的确切名称和返回类型。

如果我们指定一个方法的名称和它的返回类型是固定的呢?

让我们把这个方法命名为迭代器方法

ECMA也采取了类似的步骤来标准化自定义对象的循环过程。然而,ECMA用符号迭代器这个名字代替了迭代器这个名字。

符号提供的名称是唯一的,不能与其他属性名称冲突。同时,Symbol.iterator返回一个名为iterator的对象,该对象将有一个名为next的方法,该方法将返回一个带有键值和done的对象。

value键值包含当前值,它可以是任何类型,done是一个布尔值,它指示是否已经获得所有值。

下图可以帮助建立可迭代对象、迭代器和next之间的关系,称为迭代协议。

根据阿克塞尔劳施迈尔博士的书《探索JS》:

迭代器是一种数据结构,它希望通过实现一个关键字为Symbol.iterator的方法,使其元素对外可访问,symbol . iterator是迭代器的工厂,也就是说,它将创建迭代器。迭代器是用于遍历数据结构元素的指针。我们将使用计算属性语法来设置这个键,如下所示:

使用对象进行迭代

因此,正如我们在上一节中了解到的,我们需要实现一个名为Symbol.iterator的方法

在第四行,我们创建迭代器。它是一个定义了然后方法的对象下一个。方法根据步骤变量返回值。在第25行,我们检索迭代器,27行,我们调用然后方法,直到完成的的值为真的。

这正是的循环中发生的事情,用于-当然接受一个迭代器,并创建它的迭代器,它会一直调用next(),直到完成的为真的。

Java脚本语言中可迭代对象(可重复)

射流研究…中的很多对象都是可迭代的。它们可能不是很好的察觉,但是如果仔细检查,就会发现迭代的特征:

数组和类型字符串——遍历每个字符或统一码代码点地图——遍历其键-值对设置——遍历元素参数——函数中类似数组的特殊变量数字正射影像图元素(正在进行的工作)中使用迭代的其他一些结构是:

以.换.的循环需要一个可迭代的对象,否则,它将抛出一个类型错误。

用于(可重复的的常量值){ 0.}数组解构-由于可迭代性,会发生析构。让我们来看看:

常数数组=['a ',' b ',' c ',' d ',' e '];const [first,first,third,last]=array;等价于:

常数数组=['a ',' b ',' c ',' d ',' e '];常数迭代器=数组[符号。迭代器]();const first=iterator.next().值//因为它被跳过了,所以它没有被赋值。第三个=迭代器。下一个()。值//因为它被跳过了,所以它没有被赋值。价值扩展操作符(…)

常数数组=['a ',' b ',' c ',' d ',' e '];const newArray=[1,数组,2,3];等价于:

常数数组=['a ',' b ',' c ',' d ',' e '];常数迭代器=数组[符号。迭代器]();const NewArray=[1];用于(让next值=迭代器。next();下一个值。完成!==真;nextValue=迭代器。next()){新数组。push(下一个值。值);}新阵列。推送(2)新阵列。推送(3)承诺。全部和承诺。比赛接受可迭代对象

地图和设置

让我的博客作者可迭代

下面是一个实现,它使我的博客作者具有可迭代性:

const my avouriteauthors={ allauthors : {虚构:[' Agatha Christie ',' J. K。罗琳','苏斯博士],科学小说:['尼尔斯蒂芬森','亚瑟克拉克','艾萨克阿西莫夫罗伯特海因莱茵],幻想:托尔金,J. K。罗琳','特里普拉切特,},[Symbol.iterator]() { //获取数组中的所有作者常量类型=对象。值(这个。allau thors);//存储当前类型和索引让currentAuthorIndex=0;让currentGenreIndex=0;返回{//下一个()的实现next() { //根据当前的索引获取对应的作者信息常量作者=流派[CurrentGenReinDex];//当遍历完数组作者是,oNotHaveMoreAuthors为true const doNothaveMoreAuthors=!(CurrentAuthorIndex作者。长度);if (doNothaveMoreAuthors) { //加一继续访问下一个currentGenreIndex//重置currentAuthorIndex=0;} //如果所有体裁都遍历完了结,那么我们需要告诉迭代器不能提供更多的值const doNotHaveMoreGenres=!(currentGenreIndex流派。长度);if(donothavemoretypes){ return { value : undefined,done : true };} //如果一切正常,从当类型返回作者和当前作者索引,以便下次,下一个作者可以返回返回{ value:流派[currentGenreIndex][currenttauthorindex],done: false } } } }对于(我的avouriteauthors的常数作者){ console.log(作者);}console.log(.myFavouriteAuthors)通过本文获得的知识,你可以很容易地理解迭代器是如何工作的,这种逻辑可能有点难以理解。因此,理解这个概念的最佳方法是多多敲死代码,多多验证!

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

版权声明:解释易于理解的指南和ES6迭代器的例子是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。