代碼以下數組
for(var i=0;i<arr.length;i++) { //do something here }
注:有待優化的空間緩存
for(var i=0,len=arr.length;i<len;i++){ //do something here }
注:將長度緩存起來,避免重複獲取,基本是性能最高的一種數組遍歷方法。(在遍歷長度較多的數組時,纔會顯示優點)數據結構
arr.forEach(function(el){ //do something here })
注:數組自帶的方法性能
var arr=[2,3,4] for(var item in arr){ console.log(item)// 0,1,2 }
注:效率很低.該方法獲取的是鍵名。應用於array時,爲下標index,應用到對象時,爲key。下文提到的for of循環獲取到的是鍵值。優化
arr.map(function(item){ //do something here })
注:方式優雅,效率很低,還不如forEachcode
for(var item of arr){ // do something here }
注:是ES6所支持的方法,凡是具備iterator接口的數據接口,均可以使用for of遍歷他的成員。其內部的實現方法是調用數據結構的Symbol.iterator 方法。for of循環的使用範圍包括:數組,Set,Map,類數組對象(如arguments對象,DOM Nodelist對象等),Generator對象,以及字符串等對象
關於對象的遍歷,主要是指其屬性的遍歷。如下總結6種方法來遍歷對象的屬性繼承
for in循環遍歷對象自身 和 可繼承的 可枚舉屬性(不包含Symbol屬性)接口
該方法返回一個數組,包含對象自身的(不包含繼承的)全部可枚舉的屬性(不包含Symbol屬性)ip
注:大多數狀況下,咱們只關心對象自身的屬性,引入繼承的屬性會讓問題 複雜化。因此儘可能不要用for in循環而使用Object.keys()代替
包含對象自身的全部屬性(不包含Symbol屬性,可是包含不可枚舉的屬性)
返回一個數組,包含對象自身的全部Sybmol屬性。
返回一個數組,包含對象自身的全部屬性,無論屬性名是不是Symbol或字符串,也無論是不是可枚舉的
與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標準入門》