Javascript 数组遍历 forEach()、map( ) 的区别

在 ES5 中数组常用的遍历方法有 for 和 for in 在 ES6 中可以使用 forEach ( ) 和 map ( ) 来对数组进行遍历

for 和 for in 的区别:

    fo 循环可以遍历到数组中的空元素,但是不能遍历数组的可枚举属性 for in 循环可以把数组的可枚举属性遍历到,但是它不能遍历到数组中的空元素
var arr=[1,2,3,,4,5,6];
arr.a=3;
for(var i=0;i<arr.length;i++){
          
   
  console.log(i,arr[i]);
}

结果如下图:

var arr=[1,2,3,,4,5,6];
arr.a=3;
for(var prop in arr){
          
   
   console.log(prop,arr[prop]);
}

结果如下图: 因为数组也是属于 Object ,所以可以使用 delete 方法,delete删除数组元素,不会造成数组的自动收缩,数组的长度不会发生改变

var arr=[1,2,3,4,5,6];
delete arr[2];
console.log(arr);//[ 1, 2, undefined, 4, 5, 6 ]

利用这一特点,我们可以用来操作数组去重

var arr=[1,2,2,4,3,4,5,4,2,6,2,7];
for(var i=1;i<arr.length;i++){
          
   
	//查找arr中是否有相同元素,如果有,则删除
    if(arr.indexOf(arr[i],i+1)>-1) delete arr[i];
}
var arr1=[];
//for in 遍历不到数组的空元素
for(var prop in arr){
          
   
    arr1.push(arr[prop]);
}
//从arr1的第0位开始截取,将元素放入到arr中
arr=arr1.splice(0);
//清除arr1
arr1=null;
console.log(arr);

forEach ( ) ,不遍历空元素,也不遍历属性,forEach是匿名函数,无法阻止它在循环中断循环跳出

forEach ( ) 只能遍历数组,不能返回任何内容 forEach ( item ,index ,arr) ,常用的三个参数

    第一个参数为数组中的元素 第二个参数为下标 第三个参数为数组本身。
var arr=[2,4,6,8,10,,12,14,16,18,20];
arr.a=10;
arr.forEach(function(item,index,a){
          
   
   console.log(item,index,a);
});

打印的结果如下: forEach ( ) 的实现过程:

var list = [1,2,3,4];
function forEach(arr,fn){
          
   
    for(var i=0;i<arr.length;i++){
          
   
    	//如果是空元素,则跳过
        if(arr[i]===undefined) continue;
        fn(arr[i],i,arr);
    }
}
// 桥接模式
forEach(list,function(item,index,arr){
          
   
    console.log(item,index,arr);
})

map ( ) ,也是对数组进行遍历,跟 forEach ( ) 不同的是,它可以将回调函数中 return 的结果返回到新数组中

var list = [1,2,3,2,6,7];
var s = list.map(function(item,index,arr){
          
   
	return item + 100;
})
console.log(s);//[ 101, 102, 103, 102, 106, 107 ]

map ( ) 实现的过程:

var list = [1,2,3,2,6,7];
function map(arr,fn){
          
   
    var arr1 = [];
    for(var i=0;i<arr.length;i++){
          
   
   		//让fn()的返回值添加到arr1数组中
        arr1[i] = fn(arr[i],i,arr)
    }
    //返回新数组
    return arr1;
}
var s = map(list,function(item,index,a){
          
   
    return item + 100;
})
console.log(s);
经验分享 程序员 微信小程序 职场和发展