前言数据遍历是我们日常开发中经常用到的逻辑。除了最常见的for、while、forEach之外,迭代器还提供了数据遍历接口。了解迭代器有助于我们更好地进行数据处理。IteratorIterator是ES6引入的一种新的遍历机制。迭代器有两个核心概念:迭代器是一个统一的接口,它的作用是让各种数据结构易于访问。它使用一个key作为Symbol的.iterator方法来实现。迭代器是用于遍历数据结构元素的指针(如数据库中的游标)。迭代过程迭代过程如下:通过Symbol.iterator创建一个迭代器,指向当前数据结构的起始位置,然后通过next方法向下迭代到下一个位置。next方法会返回当前位置的对象,该对象包含value和done两个属性,value为当前属性的值,done用于判断遍历是否结束。当done为真时,遍历结束。下面用一个简单的例子来说明:constitems=["zero","one","two"];constit=items[Symbol.iterator]();它.下一个();>{value:"zero",done:false}it.next();>{value:"one",done:false}it.next();>{value:"two",done:false}it.next();>{value:undefined,done:true}在上面的例子中,首先创建一个数组,然后通过Symbol.iterator方法创建一个迭代器,然后不断调用next方法来访问数组的内部项。当属性done为真时,访问结束。迭代器是迭代协议(使用它们的规则)的一部分。该协议的一个关键属性是它是顺序的:迭代器一次返回一个值。这意味着如果可迭代数据结构是非线性的(例如树),迭代将使它成为线性的。可迭代数据结构以下是可迭代值:ArrayStringMapSetDom元素(进行中)我们将使用for...of循环迭代数据结构(参见下面的for...of循环)。数组(Array)和类型化数组(TypedArray)是可迭代的。for(letitemof["zero","one","two"]){console.log(item);}//output://zero//one//twoString字符串是可迭代的,单将它们遍历Unicode编码,每个编码可能包含一个或两个Javascript字符。for(constcof'z\uD83D\uDC0A'){console.log(c);}//output://z//\uD83D\uDC0AMapMap主要是迭代它们的entry,每一个entry都会被编码为[key,value]项,entry以一种确定的形式进行迭代,顺序与顺序相同在其中添加了它们。constmap=newMap();map.set(0,"零");map.set(1,"一个");for(letitemofmap){console.log(item);}//output://[0,"zero"]//[1,"one"]注意:WeakMaps是不可迭代的SetSet是对其元素进行迭代,迭代的顺序与constset的加法顺序相同=新设置();set.add("零");set.add("一个");for(letitemofset){console.log(item);}//输出://零//一个注意:WeakSets不是可迭代的参数arguments目前在ES6中越来越少使用但也是可遍历的函数args(){for(letitemofarguments){console.log(item);}}参数(“零”,“一”);//输出://零//一个普通对象不可迭代普通对象由对象创建,不可迭代://TypeErrorfor(letitemof{}){console.log(item);}for...of循环for...of是ES6中新引入的循环,用于替代for..in和forEach(),支持新的迭代协议。它可用于迭代常规数据类型,例如Array、String、Map和Set等。典型数据类型Arrayconstnums=["zero","one","two"];for(letnumofnums){console.log(num);}//TypedArrayconsttypedArray1=newInt8Array(6);typedArray1[0]=10;typedArray1[1]=11;for(letitemoftypedArray1){console.log(item);}Stringconststr="zero";for(letitemofstr){console.log(item);}MapletmyMap=newMap();myMap.set(0,"零");myMap.set(1,"一");myMap.set(2,"二");//遍历key和valuefor(let[key,value]ofmyMap){console.log(key+"="+value);}for(let[key,value]ofmyMap.entries()){console.log(key+"="+value);}//只遍历keyfor(letkeyofmyMap.keys()){console.log(key);}//只遍历valuefor(letvalueofmyMap.values()){console.log(value);}SetletmySet=newSet();mySet.add("零");mySet.add("一个");mySet.add("二");//遍历整个集合for(letitemofmySet){console.log(item);}//只遍历keyvaluefor(letkeyofmySet.keys()){console.log(key);}//只遍历valuefor(letvalueofmySet.values()){console.log(value);}//遍历key和value,两者将相等for(let[key,value]ofmySet.entries()){console.log(key+"="+value);}operand的可迭代数据结构必须是可迭代的,也就是说如果是普通对象,是不能迭代的。如果数据结构是数组形式,可以借助Array.from()方法进行转换和迭代。constarrayLink={length:2,0:"zero",1:"one"}//报告TypeError异常for(letitemofarrayLink){console.log(item);}//正常运行for(letitemofarrayLink)Array.from(arrayLink)){console.log(item);}//output://零//一个let,const和varforfor..of如果你使用let和const,每次迭代都会创建一个新的存储空间,保证在可迭代范围内。constnums=["零","一","二"];for(constnumofnums){console.log(num);}//报告ReferenceErrorconsole.log(num);从上面的例子我们看到,原来最后一句会报异常,因为num的作用域只在循环体内,外面是无效的。使用var时不会出现上述情况,因为var会全局作用,迭代不会每次都创建新的存储空间。constnums=["zero","one","two"];forv(varnumofnums){console.log(num);}console.log(num);//output:two上面的总结是迭代设备的一些总结,希望大家在平时的开发中能够灵活运用。~~本文到此结束,感谢阅读!~学习有趣的知识,认识有趣的朋友,塑造有趣的灵魂!大家好,我是〖编程三昧〗的作者王隐,我的公众号是《编程三昧》,欢迎关注,希望大家多多指教!
