for循环和forEach的速度问题
for循环是比较古老的循环方式,不少人对他的写法已经觉得厌烦,随着js的发展越来越多的遍历方式逐一诞生: forEach, map, filter,every,some,for of等等,简洁的语法让人赏心悦目。
forEach代码实现:
if (!Array.prototype.forEach) { Array.prototype.forEach = function(fun /*, thisArg */) { "use strict"; if (this === void 0 || this === null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun !== "function") throw new TypeError(); var thisArg = arguments.length >= 2 ? arguments[1] : void 0; for (var i = 0; i < len; i++) { if (i in t) fun.call(thisArg, t[i], i, t); } }; }
看看代码就知道了,forEach的内部实现方式也是通过for循环,加上一连串的判断怎么想想都不会觉得比单纯的for循环来的快吧!? 首先call调用比直接运行func的成本高, in检测指定的属性是否在指定的对象或其原型链中,成本也可想而知,forEach自然没有比常规for循环快的道理。 再者forEach是整个数组遍历,在针对某个元素操作时候,for循环的break可以提高运行效率。
const names = [lilei, hanmei, dave] for (let i = 0; i < names.length; i++) { if (names[i] === hanmei) { console.log(对hanmei进行操作) break } } names.forEach(name => { if(name === hanmei) { console.log(对hanmei进行操作) } })
同理map的实现方式也类似。