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的实现方式也类似。