Array.prototype.forEach()
forEach()
方法对数组的每个元素执行一次给定的函数。函数返回值为undefined
语法:
arr.forEach(callback(currentValue [, index [, array]]) [, thisArg])
(1)forEach()
方法有效值
按升序为数组中含有效值的每一项执行一次 callback
函数,那些已删除或者未初始化的项将被跳过(例如在稀疏数组上,new Array(7) 得到 [empty × 7],Array.of(7)得到[7])。
(2)数组forEach内函数的this指向
foreEach方法的第二个参数thisArg
ES5 :如果第二个参数thisArg是对象,this指向该对象;如果是undefined或者null,this指向window。——除非指定了this对象,不然函数的this指向window。(ES5中函数this的特性)
严格模式下,如果指定了对象,那么this指向该对象,否则this为undefined。除非指定了对象,不然this指向undefined——严格模式this的特性
ES6箭头函数:继承外层普通函数的this,——箭头函数特性
(3)关于修改原数组:
删除原数组某项时,以下示例:操作b这项时,处理函数中 index是1,item是b;移除了arr中b元素。导致arr为['a','c','d'],接下来index执行2。
所以打印结果:a b d
var obj = {
name: 'obj'
};
var arr = ['a','b','c','d'];
arr.forEach(function(item, index, arr){
if(index == 1){//操作b这项数据时,index是1,item是b;移除了arr中的b元素
arr.shift();
}
console.log(item);
},obj)
移除项同时添加项:结果a b d e
var obj = {
name: 'obj'
};
var arr = ['a','b','c','d'];
arr.forEach(function(item, index, arr){
if(index == 1){//操作b这项数据时,index是1,item是b;移除了arr中的b元素
arr.shift();
arr.push('e','f')
}
console.log(item);
},obj)
forEach修改元素组总结:
forEach()
遍历的范围在第一次调用 callback
前就会确定。——会计算好有效遍历次数,只少不能多,比如上面的那两个实例。比如 :[1,2,,3,4]遍历4次,最多遍历四次。
在确定遍历次数后,每次遍历根据index索引值进行——上述两个例子也能体现 。
forEach不可中止或跳出遍历:
除了抛出异常以外,没有办法中止或跳出 forEach()
循环。如果你需要中止或跳出循环,forEach()
方法不是应当使用的工具。
数组方法具有中止遍历的有:some、every、finde、findIndex
for、for in、for of可以通过break continue中止或跳出
forEach地址:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach
示例:
扁平化数组:
var result = [];
function flatten(arr){
arr.forEach((item, index) =>{
if(Array.isArray(item)){
arguments.callee(item)
}else{
result.push(item);
}
})
}
const problem = [1, 2, 3, [4, 5, [6, 7], 8, 9]];
flatten(problem)
console.log(result) // [1, 2, 3, 4, 5, 6, 7, 8, 9]