前言:本文主要比較for、for-in、forEach和for-of的異同以及優缺點。html
for循環是最原始最易理解的循環遍歷方式數組
for(var index = 0;index < arr.length;index++){ console.log(arr[index]) }
上述for循環的寫法比較繁瑣,所以數組提供了內置的forEach方法數據結構
arr.forEach((item, index) => { consoel.log(item) })
注意:函數
var arr = [1,2,3] arr.forEach((item) => { if (item === 2){ return;// 跳出本次循環 } console.log(item) } // 輸出1,3 try { arr.forEach((item) => { if (item === 2){ throw new Error() // 退出循環 } console.log(item) }) } catch(e) {} // 輸出1
for-in主要爲遍歷對象而設計,也能夠遍歷數組的鍵名。
for-in有幾個特色,一般狀況下被認爲是缺點:性能
var arr = ['a'] for(var item in arr){ console.log(item, typeof item) } // 1, string
var arr = ['a', 'b'] Array.prototype.protoName = '原型屬性' arr.name = '非索引屬性' for(var item in arr){ console.log(arr[item]) } // a,b,'非索引屬性','原型屬性'
能夠發現,for-in不只遍歷了原型鏈上的屬性,新增的非索引屬性name頁被遍歷,所以for-in不適合遍歷數組。(因爲length等屬性是不可枚舉屬性,所以沒有被遍歷)prototype
var arr = new Array(10000) for(var i=0;i< 10000;i++){ arr[i]=i } var length = arr.length console.time('for') for (var index=0; index< length; index++){ // } console.timeEnd('for') console.time('for-in') for(var index in arr){ // } console.timeEnd('for-in') // for:0.2839ms // for-in: 1.1479ms
所以,除非須要迭代一個屬性數量未知的對象,不然並不適合用for-in循環。
以上for-in的特性,在日常開發中共基本上都是缺點,但有一種可能算是優勢的特性:for-in只會遍歷數組中存在的實體設計
var arr = new Array(3) arr[2] = 'hello world' var length = arr.length for (var index=0; index< length; index++){ console.log(arr[index]) } // undefined,undefined, 'hello world' for(var index in arr){ console.log(arr[index]) } // 'hello world'
能夠看到for-in會忽略數組中爲定義的部分,能夠用於遍歷長度很大的稀疏數組。)code
相比於以上幾點,for-of幾乎結合了它們的全部優勢:htm
但須要注意,普通對象不是可迭代對象,不能用for-of遍歷。想要迭代一個對象,能夠用for-in,也能夠將對象使用Map數據結構。對象