数组遍历
1.普通for循环
代码如下
for(var i=0;i<arr.length;i++)
{
//do something here
}
注:有待优化的空间
2.优化for循环
for(var i=0,len=arr.length;i<len;i++){
//do something here
}
注:将长度缓存起来,避免重复获取,基本是性能最高的一种数组遍历方法。(在遍历长度较多的数组时,才会显示优势)
3. forEach循环
arr.forEach(function(el){
//do something here
})
注:数组自带的方法
4. for in 方法
var arr=[2,3,4]
for(var item in arr){
console.log(item)// 0,1,2
}
注:效率很低.该方法获取的是键名。应用于array时,为下标index,应用到对象时,为key。下文提到的for of循环获取到的是键值。
5. map方法
arr.map(function(item){
//do something here
})
注:方式优雅,效率很低,还不如forEach
6. for of 循环(ES6)
for(var item of arr){
// do something here
}
注:是ES6所支持的方法,凡是具有iterator接口的数据接口,都可以使用for of遍历他的成员。其内部的实现方法是调用数据结构的Symbol.iterator 方法。for of循环的使用范围包括:数组,Set,Map,类数组对象(如arguments对象,DOM Nodelist对象等),Generator对象,以及字符串等
对象的属性遍历
关于对象的遍历,主要是指其属性的遍历。以下总结6种方法来遍历对象的属性
1. for in
for in循环遍历对象自身 和 可继承的 可枚举属性(不包含Symbol属性)
2. Object.keys(obj)
该方法返回一个数组,包含对象自身的(不包含继承的)所有可枚举的属性(不包含Symbol属性)
注:大多数情况下,我们只关心对象自身的属性,引入继承的属性会让问题 复杂化。所以尽量不要用for in循环而使用Object.keys()代替
3. Object.getOwnPropertyNames(obj)
包含对象自身的所有属性(不包含Symbol属性,但是包含不可枚举的属性)
4. Object.getOwnPropertySymbols(obj)
返回一个数组,包含对象自身的所有Sybmol属性。
5. Reflect.ownKeys(obj)
返回一个数组,包含对象自身的所有属性,不管属性名是否是Symbol或字符串,也不管是否是可枚举的
6. Reflect.enumerate(obj)
与for in循环相同
扩展阅读:属性的可枚举性
描述
对象的每个属性都有一个描述对象(Descriptor),用于描述该属性的行为。
获取方法
通过Object.getOwnPropertyDescriptor方法可以获取该属性的描述对象
var a={A:1}
Object.getOwnPropertyDescriptor(a,"A");
//{
// configurable:true,
// enumerable:true,可枚举性,true
// value:1,
// writable:true
//}
引入目的
当改属性为false时,标示某些操作会忽略这个属性:
- for in 循环
- Object.keys()
- JSON.stringify()
- Object.assign()
- Reflect.enumerate()
实际上,引入改属性的目的,就是为了让某些属性能够规避掉for in循环
另外,ES6种规定,所有Class原型上的方法都是不可枚举的。
参考文献:
阮一峰:《ES6标准入门》