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);
