JavaScript的ES6之for...of用法與for...in區別


在對數組或對象進行遍歷時,我們經常會使用到兩種方法: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增加自定義屬性,查看效果。

總結

根據以上測試結果並參考了相關資料,我們得出了以下結論:

  1. 遍歷對象時推薦使用for...in,其中item為對象的key。使用for...of會報錯。
  2. 遍歷數組時推薦使用for...of,其中item為數組每一項的值。使用for...in則不能保證遍歷順序且會遍歷出自定義屬性。
  3. for...in是ES5特性,for...of是ES6特性,因此需要注意兼容性。
  4. 如果要使用for...of遍歷普通對象,需要配合Object.keys()一起使用


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM