對象和數組的遍歷

數組遍歷

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

注:方式優雅,效率很低,還不如forEachcode

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屬性)ip

注:大多數狀況下,咱們只關心對象自身的屬性,引入繼承的屬性會讓問題 複雜化。因此儘可能不要用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標準入門》

相關文章
相關標籤/搜索