3

数组遍历

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时,标示某些操作会忽略这个属性:

  1. for in 循环

  2. Object.keys()

  3. JSON.stringify()

  4. Object.assign()

  5. Reflect.enumerate()

实际上,引入改属性的目的,就是为了让某些属性能够规避掉for in循环
另外,ES6种规定,所有Class原型上的方法都是不可枚举的。

参考文献:
阮一峰:《ES6标准入门》


neove
37 声望0 粉丝

下一篇 »
React 事件冒泡