你为什么不用forEach?

433 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情

forEach和map经常被拿来做比较,并且在日常开发中,大家可能用的更多的是map。那先让我们来看一下两个的区别

forEach接收一个回调函数,回调函数可以传入3个参数,当前的遍历的值,当前的index,和当前遍历的数组。并且forEach没有返回值。

Array.forEach((value, index, arr)=>{})

map和forEach一样,也是接收一个回调函数,回调函数可以传入3个参数,当前的遍历的值,当前的index,和当前遍历的数组。不同的是,map会返回一个新数组。

Array.map((value, index, arr)=>{})

网上一直都有种说法,forEach会改变原数组,map不会改变原数组。并且map比forEach快,所以用map。但是我不太理解,因为map也是可以改变原数组啊。

var arr = [7,8,9,4,5]

arr.map((v,i,originArr)=>{
    originArr[i] = 0
})
console.log(arr) //[0, 0, 0, 0, 0]

速度这块大家也是各执己见,有的说map快,有的说forEach快。从理论来说,map每次都会返回一个新数组,而创建新数组是需要时间的。forEach不会返回新数组,所以应该是forEach快。

那么让我们来实际验证一下

var arr = new Array(10000000)
arr.fill(1)

console.group('forEach')
console.time()
arr.forEach((i) => i)
console.timeEnd()
console.groupEnd()

console.group('map')
console.time()
arr.map((i) => i)
console.timeEnd()
console.groupEnd()

image.png

从结果上来看,很明显是forEach比map更快。所以以上不是你不用forEach的理由。

既然比较速度,那么就统一比较一下各个循环之间的速度,for循环,forEach,map,for in,for of。

var arr = new Array(10000000)
arr.fill(1)

console.group('for循环')
console.time()
for (let i = 0; i < arr.length; i++) {}
console.timeEnd()
console.groupEnd()

console.group('forEach')
console.time()
arr.forEach((i) => i)
console.timeEnd()
console.groupEnd()

console.group('map')
console.time()
arr.map((i) => i)
console.timeEnd()
console.groupEnd()

console.group('for in')
console.time()
for (key in arr) {
}
console.timeEnd()
console.groupEnd()

console.group('for of')
console.time()
for (key of arr) {
}
console.timeEnd()
console.groupEnd()

image.png

我们可以看出最快的是for循环,几毫秒就完成了遍历。最慢的是for in,居然要花上将近3秒的时间。并且for循环比map快上100多倍,不过实际上,项目的可维护性>代码性能,所以虽然快,还是会选择更加可维护的写法。但即便如此,也不是你不用forEach的理由。