当前位置: 首页 > Web前端 > vue.js

新手都能看懂的ES6Iterators

时间:2023-04-01 12:53:03 vue.js

,以前好评文章的更多分类,也整理了很多我的文档和教程资料。欢迎来到星和完美。面试时可参考考点复习。我希望我们能在一起。本文旨在分析和理解迭代器。迭代器是JS中的新方法,可用于遍历任意集合。在ES6中首次亮相的迭代器。因为它们被广泛使用并且在几个场景中派上了用场,我们将从概念上理解迭代器是什么、在哪里使用它们以及示例。我们还将在JS中看到它的一些实现。介绍假设有这样一个数组constmyFavouriteAuthors=['NealStephenson','ArthurClarke','IsaacAsimov','RobertHeinlein'];在某些情况下,希望返回数组中的所有单个值,以便在屏幕上打印它们、操作它们或对它们做一些事情。如何处理?简单的方法是使用for、while、for-of方法。如下:现在,假设您有一个自定义数据结构来保存所有作者myFavouriteAuthors是一个包含另一个对象allAuthors的对象。allAuthors包含三个数组,分别包含小说、科幻小说和奇幻小说。现在,如果要求您循环访问myFavouriteAuthors以获取所有作者,您的方法是什么?您可以尝试一些循环组合来获取所有数据。但是,如果您这样做--for(letauthorofmyFavouriteAuthors){console.log(author)}//TypeError:{}isnotiterable您将收到一个TypeError,指出该对象不可迭代。让我们看看什么是可迭代对象以及如何使对象可迭代。大家都说简历里没项目可写,所以给大家找了一个项目,还给了一个【搭建教程】。我和阿里云服务器合作,优惠价格比较便宜:89/年,223/3年,比学生便宜9.9/月,买了建了一个项目,熟悉技术栈比较香(老用户可以买用他们的家庭账户,我用我妈妈的)推荐购买三年的便宜货,点击本文查看。迭代器和迭代器(IterablesandIterators)在上一节中看到了问题,从我们的自定义对象中获取所有作者并不容易。我们需要某种方式来有序地获取内部数据。我们向myFavouriteAuthors添加方法getAllAuthors以返回所有作者。如:这是一个简单的方法。帮助我们完成获取所有作者的功能。但是,此实现可能存在一些问题:getAllAuthors的名称非常具体。如果其他人正在创建他们自己的myFavouriteAuthors,他们可能会称其为retrieveAllAuthors。作为开发人员,我们总是需要知道返回所有数据的具体方法,在本例中它被命名为getAllAuthors。getAllAuthors返回一个字符串数组,如果另一个开发人员以这种格式返回一个对象数组怎么办:[{name:'AgathaChristie'},{name:'J.K.Rowling'},...]人们必须知道返回所有数据的方法的确切名称和返回类型。如果我们规定方法的名称和它的返回类型是固定的呢?让我们为方法命名---iteratorMethodECMA采取了类似的步骤来标准化循环自定义对象的过程。但是,ECMA使用名称Symbol.iterator而不是名称iteratorMethod。Symbols提供的名称是唯一的,不能与其他属性名称冲突。此外,Symbol.iterator返回一个名为iterator的对象,该对象将有一个名为next的方法,该方法将返回一个具有键value和done的对象。valuekeyvalue包含当前值,可以是任意类型,done是一个boolean,表示是否所有的值都已经取完。下图可以帮助建立可迭代对象、迭代器和next之间的关系,称为迭代协议。根据AxelRauschmayer博士的书《探索JS》:可迭代对象是一种数据结构,它希望通过实现关键字为Symbol.iterator的方法使其元素可从外部访问,该方法是迭代器的工厂,也就是说,它将创建迭代器。迭代器是一个指针,用于迭代数据结构的元素,我们将使用计算属性语法来设置这个键,如下所示:实现一个名为Symbol的对象.iterator方法在我们创建迭代器的第4行。它是一个定义next方法的对象。next方法返回一个基于step变量的值。在第25行,我们检索迭代器,在第27行,我们调用next方法,直到done的计算结果为真。这正是for-of循??环中发生的事情,for-of接受一个迭代器,并创建它的迭代器,它一直调用next()直到done为真。大家都说简历里没项目可写,所以给大家找了一个项目,还给了一个【搭建教程】。我和阿里云服务器合作,优惠价格比较便宜:89/年,223/3年,比学生便宜9.9/月,买了建了一个项目,熟悉技术栈比较香(老用户可以买用他们的家庭账户,我用我妈妈的)推荐购买三年的便宜货,点击本文查看。JavaScript中的可迭代对象(iterable)JS中的很多对象都是可迭代的。它们可能不是很容易察觉,但是如果你仔细观察,你会发现迭代的特点:Arrays和TypedArraysStrings---迭代每个字符或Unicode代码点Maps---迭代它的键值对Sets---遍历元素arguments---函数中类似数组的特殊变量DOM元素(进行中)JS中使用迭代的其他一些结构是:会抛出类型错误。for(constvalueofiterable){...}数组解构——解构是由于可迭代而发生的。让我们看看:constarray=['a','b','c','d','e'];const[第一个,第三个,最后一个]=数组;相当于:constarray=['a','b','c','d','e'];常量迭代器=数组[符号。迭代器]();constfirst=迭代器。下一个()。值迭代器。下一个()。value//因为跳过了,所以没有赋值constthird=iterator.next().valueiterator.next().value//因为跳过了,所以没有赋值constlast=iterator.next().valueExtensionoperator(...)常量数组=['a','b','c','d','e'];constnewArray=[1,...数组,2,3];相当于:constarray=['a','b','c','d','e'];constiterator=array[Symbol.iterator]();constnewArray=[1];for(letnextValue=iterator.next();nextValue.done!==true;nextValue=iterator.next()){newArray.push(nextValue.value);}newArray.push(2)newArray.push(3)Promise.all和Promise.race接受可迭代对象Maps和Sets使myFavouriteAuthors可迭代这是一个使myFavouriteAuthors可迭代的实现:constmyFavouriteAuthors={allAuthors:{fiction:['AgathaChristie','J.K.罗琳”,“博士。Seuss'],科幻小说:['NealStephenson','ArthurClarke','IsaacAsimov','RobertHeinlein'],幻想:['J.R.R.托尔金','J.K.Rowling','TerryPratchett'],},[Symbol.iterator](){//获取数组中的所有作者constgenres=Object.values(this.allAuthors);//存储当前流派和索引letcurrentAuthorIndex=0;让currentGenreIndex=0;return{//next()的实现next(){//根据当前索引获取对应的作者信息constauthors=genres[currentGenreIndex];//遍历authors数组时,oNotHaveMoreAuthors为真constdoNothaveMoreAuthors=!(currentAuthorIndex