在對數組或對象進行遍歷時,我們經常會使用到兩種方法:for...in
和 for...of
,那么這兩種方法之間的區別是什么呢?
第一:for...in
for...in 循環只遍歷可枚舉屬性。像 Array和 Object使用內置構造函數所創建的對象都會繼承自Object.prototype和String.prototype的不可枚舉屬性,例如 String 的 indexOf() 方法或 Object的toString()方法。循環將遍歷對象本身的所有可枚舉屬性,以及對象從其構造函數原型中繼承的屬性(更接近原型鏈中對象的屬性覆蓋原型屬性)。
下面我們簡單的使用for...in
分別對對象和數組在谷歌的控制台進行遍歷:
首先遍歷對象:
接着遍歷數組:
我們發現,使用for...in
進行遍歷時,item值為對象的key,為數組的index。
我們知道,數組索引只是具有整數名稱的枚舉屬性,並且與通用對象屬性相同,因此不能保證for...in
以某種固定的順序返回索引,因此,不推薦使用for...in
進行數組的遍歷
下面,我們在上面代碼的基礎上,在arr數組上增加一個自定義屬性,再次遍歷,查看結果。
我們發現,for...in
不僅會遍歷數組中的元素,還會遍歷自定義屬性
第二:for...of
for...of語句在可迭代對象(包括 Array,Map,Set,String,TypedArray,arguments 對象等等)上創建一個迭代循環,調用自定義迭代鈎子,並為每個不同屬性的值執行語句。
同樣的,我們還是使用與for...in
相同的代碼進行測試
我們可以看出,使用for...of
對對象進行遍歷時,報了TypeError: obj is not iterable
錯誤,對數組進行遍歷時,item直接是數組每一項的值。
我們再為arr增加自定義屬性,查看效果。
總結
根據以上測試結果並參考了相關資料,我們得出了以下結論:
- 遍歷對象時推薦使用
for...in
,其中item為對象的key。使用for...of
會報錯。 - 遍歷數組時推薦使用
for...of
,其中item為數組每一項的值。使用for...in
則不能保證遍歷順序且會遍歷出自定義屬性。 for...in
是ES5特性,for...of
是ES6特性,因此需要注意兼容性。- 如果要使用
for...of
遍歷普通對象,需要配合Object.keys()
一起使用