这篇文章比较了四种遍历数组的方式:for循环:for(letindex=0;index{console.log(elem,index);});for-of循??环:for(constelemofsomeArray){console.log(elem);}for-of通常是最佳选择,我们将了解原因。for循环[ES1]JavaScript中的普通for循环相当古老,它从ECMAScript1开始就存在了。这个for循环记录了arr的每个元素的索引和值:constarr=['a','b','c'];arr.prop='propertyvalue';for(letindex=0;index{console.log(elem,index);});//Output://'a',0//'b',1//'c',2这个方法真的很方便。它让我们无需做太多事情就可以访问数组元素和数组元素索引。箭头函数(在ES6中引入)使这种方法在语法上更加优雅。.forEach()的主要缺点是:您不能在此类循环的“主体”中使用await。你不能提前退出.forEach()循环,在for循环中,我们可以使用break。Exit.forEach()——解决方法如果您想使用.forEach()之类的循环并提前离开,有一个解决方法:.some()如果其回调返回真值,也会循环遍历所有Array元素,然后停止。onstarr=['red','green','blue'];arr.some((elem,index)=>{if(index>=2){returntrue;//breakfromloop}console.log(elem);//Thiscallback隐式返回`undefined`,//是falsyvalue.Therefore,loopingcontinues.});//Output//'red'//'green'可以说这是对.some()的滥用,我不知道这段代码有多容易理解(对比for-of和break)。for-of循??环[ES6]在ECMAScript6中,for-of循??环被添加到JavaScript中。constarr=['a','b','c'];arr.prop='propertyvalue';for(constelemofarr){console.log(elem);}//output://'a'//'b'//'c'for-of非常适合遍历数组:它遍历数组元素。我们可以使用await:并且,如果需要,可以轻松迁移到for-await-of。我们可以使用break和continue——即使对于外部作用域。for-of和可迭代对象for-of的另一个好处是我们不仅可以遍历数组,还可以遍历任何可迭代对象——例如,遍历映射。constmyMap=newMap().set(false,'no').set(true,'yes');for(const[key,value]ofmyMap){console.log(key,value);}//输出://false,'no'//true,'yes'迭代myMap产生[key,value]对,我们解构它们以直接访问每对的组件。for-ofwitharrayindexing数组方法.entries()返回一个可迭代的[index,value]对。如果我们使用for-of和解构这个方法,我们可以很容易地访问Array索引。constarr=['巧克力','香草','草莓'];for(const[index,elem]ofarr.entries()){console.log(index,elem);}//output://0,'chocolate'//1,'vanilla'//2,'strawberry'总结如我们所见,for-of循??环比for、for-in和.forEach()更有用。四种循环机制之间的任何性能差异通常都不显着。如果有的话,你可能正在做一些计算密集型的事情,切换到WebAssembly可能是有意义的。