forEach()是ECMAScript 5中对数组(Array)对象增加的实例方法,该方法会按数组索引的升序,为数组中每一项都执行一次给定的函数。相对于for…in循环,使用forEach()方法遍历数组元素更简单。
1. 语法结构
array.forEach(callback[, thisArg])
callback,要为数组的每一项执行的函数。该函数有以下三个参数:
currentValue,当前项的值,即:遍历时正在被处理的数组项
index,当前项的索引值(下标)
array,数组本身
thisArg,可选参数,用来当作callback函数内this值的对象。
forEach()方法会按升序为数组中的每一项执行一次callback函数。被执行的项只是有效项,已删除或者从未赋值的项将被跳过。
如果给forEach传递了thisArg参数,它将作为callback函数的执行上下文,其类似执行以下函数:
callback.call(thisArg, element, index, array)
如果thisArg值为 undefined或null,函数的this值取决于当前执行环境是否为严格模式:严格模式下为undefined、非严格模式下为全局对象。
2. forEach()与for…in循环
forEach()会按数组元素索引的升序为数据中的每一基执行callback函数,而for…in循环可以按升级或降序遍历数组中的元素。在按升序遍历数组时,二者在功能上比较类似,这时使用forEach()方法,代码更为简洁。
var arr = [2, 3, 7];
for(var i=0; i < arr.length; i++) {
console.log('a['+i+'] = '+ arr[i]);
}
// a[0] = 2
// a[1] = 3
// a[2] = 7
arr.forEach(function(v, i){
console.log('a['+i+'] = '+ v);
})
3. forEach()方法的使用
使用forEach()打印数组的内容:
function logArrayElements(element, index, array) {
console.log("a[" + index + "] = " + element);
}
[2, 5, 9].forEach(logArrayElements);
// a[0] = 2
// a[1] = 5
// a[2] = 9
使用forEach()实现对象方法:
function copy(o) {
var copy = Object.create(Object.getPrototypeOf(o));
var propNames = Object.getOwnPropertyNames(o);
propNames.forEach(function(name) {
var desc = Object.getOwnPropertyDescriptor(o, name);
Object.defineProperty(copy, name, desc);
});
return copy;
}
var o1 = { a: 1, b: 2 };
var o2 = copy(o1); // 从对象o1复制得到o2
上面示例中,使用Object.create()方法创建了新对象,并使用forEach()方法遍历原对象的属性将其复制到了新对象中。