问题:在实现同样功能的前提下,map和forEach除了能够节省代码量之外,还有其他的优势吗?
效率方面经过我的测试,for高于另外两个方法。总体排序:
for > forEach > map
效率测试代码:
var arr = [],
max = 1000;
for (var i = 1; arr.push(i++) < max;);
var mapArr = [],forEachArr = [],forArr = [];
console.time('map');
arr.map(function (val) {
mapArr.push(val);
})
console.timeEnd('map');
console.time('forEach');
arr.forEach(function (val) {
forEachArr.push(val);
})
console.timeEnd('forEach');
console.time('for');
for (var i = 0; i < arr.length; i++) {
forArr.push(arr[i]);
}
console.timeEnd('for');
执行了三次,结果分别为:
--------------------- 分割线 ---------------------
补充问题:
map在功能定义上来说不适合与for以及forEach来进行比较,它会生成一个经过处理的新数组,因此内部实现肯定会相对于forEach来说更复杂一些。
这个问题应该问的是:forEach相对于for来说,实现同样的功能,除了方便书写能够节省代码量之外,还有没有其他的优势或者特殊用途?
备注:如果对于效率要求高的项目相信不会使用forEach来遍历数组,所以才会问使用forEach有没有在哪个方面有明显的好处。
-------------------1月16日更新------------------------
首先,感谢各位回答!
第一次的问题是:for+i、forEach、map这三种方式在遍历数组的时候,各有什么优势和区别?
这个问题中,map的功能定位不同于另外两个方式,所以放在一起做对比不是很合适。不过大家还是给出了一些很有用的答案。
后来原问题改成了:JavaScript中遍历数组的方式:forEach 相对于 for 有什么优势?
经过这么多天大家的解答以及补充,我学到了很多有用的知识点。再次感谢大家。
forEach相比普通的for循环的优势在于对稀疏数组的处理,会跳过数组中的空位。
如下所示:
for 循环
forEach循环
map可以做链式操作,forEach不可。
怎么都没人说
for...in...
会遍历prototype
而
for+i
不会呢,所以没有特殊情况我一般都用for+i
,不会有坑,也没觉得写起来多麻烦,性能还最好,不用担心兼容性的问题(forEach只支持IE9及以上)。最主要的是,for有一个好处是可以
break
。for
,forEach
,map
这三个方法本质上是不同的。for
是循环的基础语法,可以有for...in
,foo...of
,for(let i = 0; i < len; i++)
等。在for
循环中可以使用continue
,break
来控制循环。forEach
可以当做是for(let i = 0; i < len; i++)
的简写,但是不能完成i + n
这种循环,同时也不支持continue
和break
,只能通过return
来控制循环。另外,使用forEach
的话,是不能退出循环本身的。map
的用法应该是循环当前可循环对象,并且返回新的可循环对象
,跟for
和forEach
是不同的。map
和forEach
语义上和功能上都是不一样的,一个是将数组映射到一个新的数组,一个是对数组进行遍历forEach
和for
循环更多是个语法糖吧,写的时候可以省一些代码,感觉比较linq而且for有很多种用法,比如一般的
for+i
,for...in...
,for...of...
,有的人比较迷糊的会用错,而forEach
就一个用法,遍历数组,功能比较单一个人觉得 第一是forEach代码写起来比较清晰,不用再次用索引去定位需要循环的元素。第二是forEach的索引是独立的,不容易出现问题。
arr.map(function (val) {
mapArr.push(val);
})
这么用不对。
要这么用:
mapArr = arr.map(i=>i);
首先, for + i 最快, 前提是length要提前计算出来, 而不是你写的代码那样, 改成这样
一般你会遇见到js代码中哪些数据量非常大, 比如我做的"数据可视化"这类项目(一般结合echarts和highcharts), 一般list集合都会有几百上千甚至上万个元素, 可能是天气的变化趋势, 也可能是股票的趋势, 那么如果要对list元素进行处理的时候, 一定是要用for + i的(如何涉及到快速查找某一个元素, 要转成hash这种key-value对象), 因为数据量越大, 越能显现出他的优势!
反之如果是一些数据量较小的业务数据处理, 而且是代码中出现挺频繁的, 最好用函数式编程的方式来让代码简洁, 并提高可读性, 因为for + i此时并没有多大的性能优势
补充几点吧:
ES5的遍历方法可以直接用在非数组的List对象上(https://developer.mozilla.org...),省去了
Array.from
或者slice成数组的步骤,比如这里省去你自己写i了,
(item, index)
ES6写法(箭头函数)比较优雅,更尤其是
.filter()
方法时讲道理本质不都是for循环。。map和forEach只是为了方便使用