大家好,我是进阶学习者。首先,可迭代(Iterable)对象的概念是数组的泛化。这个概念是任何对象都可以定制为在for..of循环中可用。数组是可迭代的。但不仅仅是数组,许多其他内置对象也是可迭代的。其次,通过创建对象,可以轻松掌握迭代的概念。1.字符串是可迭代数组,字符串是使用最广泛的内置可迭代对象。对于一个字符串,for..of遍历它的每一个字符:for(letcharof"test"){//触发4次,每个字符触发一次alert(char);//t,thene,thens,thent}forSurrogatepairs(代理对),它也有效!alert(char);//𝒳,then😂}2.显式调用迭代器(如何显式使用迭代器?)。将以与for..of完全相同的方式遍历字符串,但使用直接调用。此代码创建一个字符串迭代器并“手动”从中获取值。letstr="Hello";//做同样的事情for..of//for(letcharofstr)alert(char);letiterator=str[Symbol.iterator]();while(true){letresult=iterator.next();if(result.done)break;alert(result.value);//一个一个输出字符}注意:这很少需要,但比for..of提供更多控制。例如,可以拆分迭代过程:迭代一部分,然后停止,做一些其他处理,然后恢复迭代。3.Array.from有一个全局方法Array.from可以接受一个可迭代的或类似数组的值,并从中得到一个“真正的”数组。然后您可以在其上调用数组方法。示例:letarrayLike={0:"Hello",1:"World",length:2};letarr=Array.from(arrayLike);//(*)alert(arr.pop());//World(popmethodisvalid)//World(pop方法有效)结果:第(*)行的Array.from方法获取对象,检查它是可迭代对象还是类数组对象,然后创建一个新数组并填充该对象的所有元素都被复制到这个新数组中。现在使用Array.from将字符串转换为单个字符数组:letstr='𝒳😂';//将str拆分为字符数组letchars=Array.from(str);alert(chars[0]);//𝒳alert(chars[1]);//😂alert(chars.length);//2运行结果:注意:与str.split方法不同,依赖Iterable字符串的属性。所以,就像for..of一样,代理对被正确处理。(注释:代理项对是UTF-16扩展字符。)另一个表达式在技术上与以下内容做同样的事情:letstr='𝒳😂';letchars=[];//Array.from内部执行相同的循环for(letcharofstr){chars.push(char);}alert(chars);运行结果:但是Array.from更加精简。甚至可以创建基于Array.from的代理感知切片方法:functionslice(str,start,end){returnArray.from(str)。slice(start,end).join('');}letstr='𝒳😂𩷶';alert(slice(str,1,3));//😂𩷶//native方法不支持识别代理对(译注:UTF-16扩展字符)alert(str.slice(1,3));//乱码(两个不同UTF-16扩展拼接的结果characterfragments)3.总结本文基于JavaScript基础。引入了Iterable对象(iterableobject),for..of对象的应用称为iterable。通过创建对象,详细说明了字符串是可迭代的。显式调用迭代器,并在实践中使用Array.from。欢迎大家积极尝试。有时候看别人实现很简单,但是到了自己实现的时候,总会出现各种各样的问题。不要野心太大,努力理解得更深刻。代码很简单,希望对大家学习有所帮助。本文转载自微信公众号《前端进阶学习交流》,可通过以下二维码关注。转载本文请联系前端进阶学习交流公众号。
