遍历数组
1、forEach方法
用来调用数组的每个元素,将元素传给回调函数。
- 不会返回新数组;
- 无法中途跳出循环,
return
或break
无效; - 会跳过数组的空位;
- 不会改变原始数组。
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
不同的是,它可以正确响应break
、continue
和return
语句; - 不会忽略空位,将空位处理成
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"]