今天我们就来看看Array中Array.forEach()和Array.map()方法的区别。forEach()和map()方法通常用于遍历Array元素,但几乎没有区别,下面一一介绍。1.返回值forEach()方法返回undefined,而map()返回一个新数组,其中包含转换后的元素。constnumbers=[1,2,3,4,5];//使用forEach()constsquareUsingForEach=[];numbers.forEach(x=>squareUsingForEach.push(x*x));//使用map()constsquareUsingMap=numbers.map(x=>x*x);console.log(squareUsingForEach);//[1,4,9,16,25]console.log(squareUsingMap);//[1,4,9,16,25]由于forEach()返回undefined,我们需要传递一个空数组来创建一个新的转换后的数组。map()方法没有这个问题,它直接返回新的转换后的数组。在这种情况下,建议使用map()方法。2.链接其他方法map()方法的输出可以与其他方法(如reduce()、sort()、filter())链接起来,在一个语句中执行多个操作。另一方面,forEach()是一个终端方法,这意味着它不能与其他方法链接,因为它返回未定义。我们使用下面两种方法求数组中每个元素的平方和:onstnumbers=[1,2,3,4,5];//使用forEach()constsquareUsingForEach=[]letsumOfSquareUsingForEach=0;numbers.forEach(x=>squareUsingForEach.push(x*x));squareUsingForEach.forEach(square=>sumOfSquareUsingForEach+=square);//使用map()constsumOfSquareUsingMap=numbers.map(x=>x*x).reduce((总计,价值)=>总计+价值);console.log(sumOfSquareUsingForEach);//55console.log(sumOfSquareUsingMap);//55当需要多次操作时,使用forEach()方法是一项非常繁琐的工作。在这种情况下,我们可以使用map()方法。3.性能//Array:varnumbers=[];for(vari=0;i<1000000;i++){numbers.push(Math.floor((Math.random()*1000)+1));}//1.forEach()console.time("forEach");constsquareUsingForEach=[];numbers.forEach(x=>squareUsingForEach.push(x*x));console.timeEnd("forEach");//2.map()console.time("map");constsquareUsingMap=numbers.map(x=>x*x);console.timeEnd("map");这是**MacBookPro上的GoogleChromev83.0.4103.106(64-bit)**运行上述代码后的结果。建议复制上面的代码到自己的控制台试试。forEach:26.596923828125msmap:21.97998046875ms很明显,map()方法对于元素的转换要优于forEach()方法。4.中断遍历这两种方法都不能被break中断,否则会抛出异常:constnumbers=[1,2,3,4,5];//break;insideforEach()constsquareUsingForEach=[];numbers。forEach(x=>{if(x==3)break;//<-SyntaxErrorsquareUsingForEach.push(x*x);});//break;insidemap()constsquareUsingMap=numbers.map(x=>{if(x==3)break;//<-SyntaxErrorreturnx*x;});上面的代码会抛出SyntaxError:?UncaughtSyntaxError:Illegalbreakstatement如果需要中断遍历,应该使用简单的for循环或者for-??of/for-in循环。constnumbers=[1,2,3,4,5];//中断;insidefor-ofloopconstsquareUsingForEach=[];for(xofnumbers){if(x==3)break;squareUsingForEach.push(x*x);};console.log(squareUsingForEach);//[1,4]5.最后推荐使用map()对数组元素进行转换,语法短,可链接,性能更好。如果不想返回数组或转换数组的元素,请使用forEach()方法。最后,如果你想根据某些条件停止或中断数组的便利性,你应该使用简单的for循环或for-of/for-in循环。
