数组forEach方法详解

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]

 

上一篇:原生for循环、forEach、for in 、 for of的区别


下一篇:学习Java 8的核心新特性:Lambda(匿名函数)、流