for-in/of 對象遍歷的區別


Object 遍歷的方法

for  in

用於對象的可訪問屬性的遍歷,for-in 讀取鍵名,適合處理對象

     遍歷數字鍵,也會遍歷非數字鍵或其他屬性

     返回key在迭代中不保證返回順序

 

for of

用於讀取可迭代屬性的value,for-of 讀取鍵值

      數據結構有Symbol.iterator屬性,表示有 iterator 接口,可以使用 for-of 循環

   for-of 內部調用數據結構的Symbol.iterator方法

      直接取值簡潔高效

      和forEach不同,可以使用continue  break   return

      可以遍歷大部分的數據結構,可以處理【類數組】

     

      類數組

      String                  字符串

      DOM NodeList      節點列表

      arguments            函數參數

      set                       Set

      map                     Map

 

      使用  for-of 處理對象  需要先進行預處理

      entries() 轉為迭代器對象 用of訪問,返回值帶有index

      Object.prototype.toString.call( arr.entries())

      //   "[object Array Iterator]"  類型名稱特殊

      keys() 先獲取一個key的數組,基於數組進行對象遍歷

 

       特殊處理,使用生成器將迭代器或者數組循環中的值,分步返回,在用循環迭代,迭代器方式返回key。

       function* entries(obj) {

            for (let key of Object.keys(obj)) {

                 yield [key, obj[key]];

            }

       }

      

對比

      Object.keys(obj)    自身可枚舉屬性   (不含Symbol屬性,不包括原型鏈上的屬性)

      for in                   自身可枚舉屬性 (包括原型鏈上的屬性)

      hasOwnProperty   是否是自身屬性,不包括數組的empty,不包括原型鏈的屬性

      

      Object.getOwnPropertyNames(obj)       自身屬性名列表

      Object.getOwnPropertySymbols(obj)    自身Symbol屬性

 

      Reflect.ownKeys(obj)   包含對象自身所有屬性,屬性名是Symbol或字符串,或者是否可枚舉.

 


免責聲明!

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



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