ES5-Array-foreach

参考文章:ES5中新增的Array方法详细说明

forEach方法与map方法很相似,也就是调用数组的每个元素,并将元素传递给回调函数
也就是对于数组中出现的每个元素,forEach 方法都会调用 callbackfn 函数一次。
但是,forEach方法不返回值,只用来操作数据map方法必须要return返回值。 这就是说,如果数组遍历的目的是为了得到返回值,那么使用map方法,否则使用forEach方法。
forEach 方法不直接修改原始数组。


语法

array.forEach(function(value, index, arr), thisValue)
复制代码
参数描述
value必需。当前元素
index可选。当前元素的索引值。
arr可选。当前元素所属的数组对象。
thisValue可选。绑定参数函数的this变量。

回调函数语法

[1, 2, 3, 4].forEach(function (value, index, array) {
    console.log(value, index, array)
});
// 结果:
// 1, 0, [1, 2, 3, 4]
// 2, 1, [1, 2, 3, 4]
// 3, 2, [1, 2, 3, 4]
// 4, 3, [1, 2, 3, 4]
复制代码

对比jQuery中的$.each方法:

$.each([], function(index, value, array) {
    // ...
});
复制代码

会发现,第1个和第2个参数正好是相反的,大家要注意了,不要记错了。后面类似的方法,例如$.map也是如此。

现在看稍显完整的例子,数组求和:

var sum = 0;

[1, 2, 3, 4].forEach(function (item, index, array) {
  console.log(array[index] == item); // true
  sum += item;
});
alert(sum); // 10
复制代码

更进一步,forEach除了接受一个必须的回调函数参数,还可以接受一个可选的上下文参数(改变回调函数里面的this指向)。

array.forEach(callback,[thisObject])
复制代码
  • 下面代码中,空数组out是forEach方法的第二个参数,结果,回调函数内部的this关键字就指向out。
var out = [];

[1, 2, 3].forEach(function(elem) {
  this.push(elem * elem);
}, out);

out // [1, 4, 9] 
// out代替this
复制代码
  • 如果这第2个可选参数不指定,则Window会传递给this,严格模式下为undefined
[1, 2, 3].forEach(function(elem) {
 console.log(this);	
});
//Window
//Window
//Window
复制代码

注意,forEach方法无法中断执行,总是会将所有成员遍历完。如果希望符合某种条件时,就中断遍历,要使用for循环。

var arr = [1, 2, 3];

for (var i = 0; i < arr.length; i++) {
  if (arr[i] === 2) break;
  console.log(arr[i]);
}
// 1
复制代码

上面代码中,执行到数组的第二个成员时,就会中断执行。forEach方法做不到这一点

forEach方法也会跳过数组的空位

var log = function (n) {
  console.log(n + 1);
};

[1, undefined, 2].forEach(log)
// 2
// NaN
// 3

[1, null, 2].forEach(log)
// 2
// 1
// 3

[1, , 2].forEach(log)
// 2
// 3
复制代码

上面代码中,forEach方法不会跳过undefined和null,但会跳过空位

  • 注意:JavaScript以NaN的形式输出Number.NaN。说明某些算术运算的结果不是数字。NaN与其他数值进行比较的结果总是不相等的,包括它自身在内。因此,不能与Number.NaN比较来检测一个值是不是数字,而只能调用 isNaN() 来比较。

综上全部规则,我们就可以对不支持foreach的IE6-IE8进行仿真扩展了,如下代码:

// 对于古董浏览器,如IE6-IE8
if (typeof Array.prototype.forEach != "function") {
  Array.prototype.forEach = function (fn, context) {
    for (var k = 0, length = this.length; k < length; k++) {
      //Object.prototype.hasOwnProperty.call(this, k)意思是将hasOwnProperty方法的原始定义放到this对象上执行
      if (typeof fn === "function" && Object.prototype.hasOwnProperty.call(this, k)) {
        fn.call(context, this[k], k, this);
      }
    }
  };
}
复制代码
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值