几种遍历数组和对象的方法及其区别

遍历数组

1、forEach方法

用来调用数组的每个元素,将元素传给回调函数。

  • 不会返回新数组
  • 无法中途跳出循环,returnbreak无效
  • 会跳过数组的空位;
  • 不会改变原始数组。
var arr = [0, ,4,6,8];
var sum = 0;
var str = arr.forEach(function(item,index,arr){
    sum += item;
    console.log("sum的值为:",sum); //0 4 10 18
})
console.log(sum);//20
console.log(str); //undefined

2、filter方法

filter的使用和forEach很像,filter为数组中的每个元素调用一次callback函数,并利用所有使得callback返回为true的值的元素来创建一个新数组。

  • 返回新数组;
  • 跳过数组的空位;
  • 不会改变原始数组。
var arr = [0, ,4,6,8];
var sum = 0;
var str = arr.filter(function(item){
    console.log(item); // 0 4 6 8
    return item >1;
})
console.log(str); // [4, 6, 8]

3、map方法

map即是 “映射”的意思 用法与 forEach 相似。

  • 会跳过空位,但会保留这个值;
  • 支持return,返回新数组;
  • 不会改变原始数组。
// 没有return的时候
var arr = [0, ,4,6,8];
var sum = 0;
var str = arr.map(function(item,index,arr){
    sum += item;
    console.log(sum); // 0 4 10 18
});

console.log(str); // [undefined, empty, undefined, undefined, undefined]

// 有return的时候
var arr = [0, ,4,6,8];
var sum = 0;
var str = arr.map(function(item,index,arr){
    sum += item;
    console.log(sum);  // 0 4 10 18
    return item/2;
});

console.log(str); // [0, empty, 2, 3, 4]

4、for...of方法

for...of循环可以使用的范围包括数组、Set 和 Map 结构、某些类似数组的对象(比如arguments对象、DOM NodeList 对象)、后文的 Generator 对象,以及字符串。

  • forEach不同的是,它可以正确响应breakcontinuereturn语句;
  • 不会忽略空位,将空位处理成undefined
var arr = [0, ,4,6,8];
for(let item of arr){
    console.log(item); // 0 undefined 4 6 8
}
  • for...of遍历的只是数组内的元素,只返回具有数字索引的属性 (不包括数组的原型属性等);
Array.prototype.method=function(){
  console.log(this.length);
}

var arr = [0, ,4,6,8];
arr.foo = 'hello';
for(let item of arr){
    console.log(item); // 0 undefined 4 6 8
}

数组原型上的属性和数组上不是数字索引的属性均无法遍历。

遍历对象

以下为所定义的对象,包括对象原型上的方法,将对象属性设为不可枚举等,后面均以这个对象为例:

// 在原型上添加方法
Object.prototype.method=function(){
  console.log(this.length);
}

var obj={
  a:1,
  b:2,
  c:3
}
obj.foo = 'hello';
// 将bar设为不可枚举
Object.defineProperty(obj, "bar", {
    value: "world",
    //是否为枚举属性
    enumerable: false
});

5、for...in方法

遍历的是索引(即键名),但是会遍历手动添加的其他键,包括原型链上的键,不包括不可枚举的。

for(let key in obj){
    console.log(key); // a b c foo method
}

如果不想遍历原型方法和属性的话,可以用hasOwnPropery方法可以判断某属性是否是该对象的实例属性。

for(let key in obj){
    if(obj.hasOwnProperty(key)){
    console.log(key); // a b c foo
  }
}

使用 for...in 也可以遍历数组,但是会存在以下问题

  • 索引为字符串型数字,不能直接进行几何运算

  • 遍历顺序有可能不是按照实际数组的内部顺序

  • 会遍历数组所有的可枚举属性,包括原型。

6、其他方法(返回数组)

  • Object.keys():获取对象的实例属性组成的数组 (不包括原型方法和属性),所有可枚举属性;
console.log(Object.keys(obj)); // ["a", "b", "c", "foo"]
  • Object.getOwnPropertyNames():包含对象自身的所有属性,包括不可枚举属性;
console.log(Object.getOwnPropertyNames(obj)); // ["a", "b", "c", "foo", "bar"]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容