幾種遍歷方式的比較


主要從幾個方面討論

   1.是否有返回值

   2.是否在遍歷過程中拿到value、key或者value、index

   3.適用數據類型

 4.遍歷對象是否包含Symbol屬性或者不可枚舉屬性

 

一、for 、while、do while幾種循環(靈活而冗雜)

          是否有返回值:非函數,不討論              

    value、index

    數組

就拿for來舉例

let arr =[1,2,3,4]
for (let i =0;i<arr.length;i++){
console.log(i,arr[i])
}

 

二、forEach(只是操作數組而不需它給任何值)

  沒有返回值

  value、index

  數組、Set

let arr =['L','O','V','E']
    let res=arr.forEach((value,index)=>{
      console.log(value,index)
    })
     console.log('返回值',res)

 

 

三、map(操作數組,同時拿到操作后的值)

  有返回值

  value、index

  數組

let arr =['L','O','V','E']
    let res=arr.map((value,index)=>{
      console.log(value,index)
    })
     console.log('返回值',res)

 

明顯可以看到返回值那里的區別,如果想拿到對應的value和index,需要手動return

 let arr =['L','O','V','E']
    let res=arr.map((value,index)=>{
      console.log(value,index)
          return value
    })
     console.log('返回值',res)

 

 

四、for...in(只想拿到數組的索引或者對象本身及父對象可枚舉的屬性名,不含Symbol屬性)

  非函數

  key或者index

  對象和數組

let obj = {name:'shyno',age:18}
    for(let key in obj){
      console.log(key)
    }

 

    let arr =['L','O','V','E']
    for(let key in arr){
      console.log(key)
    }

 

五、Object.keys()(拿到對象的所有可枚舉屬性名或者數組索引並且放到一個數組中)  

  一個數組

  keys或者indexs

  對象和數組

    let obj = {name:'shyno',age:18}
    let res=Object.keys(obj)
    console.log('結果',res)

  

    let arr =['L','O','V','E']
    let res=Object.keys(arr)
    console.log('結果',res)

  

六、for...of(所有有iterator接口的數組、對象、偽數組都可以拿到value,切記Object對象不可以)

  非函數

  value

  Array,Map,Set,String,TypedArray,函數的 arguments 對象,NodeList 對象(其中字符串會可以識別Unicode字符)

let arr =['L','O','V','E']
    for(let value of arr){
      console.log(value)
    }

  

 

七、Object.getOwnPropertyNames(obj)(對象自身的所有屬性(不含Symbol屬性,但是包括不可枚舉屬性))

   一個數組

  keys或者indexs(如果是數組,還會有個'length',因為它是不可枚舉屬性)

  對象和數組

    let obj = {name:'shyno',age:18}
    let res =Object.getOwnPropertyNames(obj)
    console.log(res)

 

 

    let arr =['L','O','V','E']
    let res =Object.getOwnPropertyNames(arr)
    console.log(res)

  

 

八、Reflect.ownKeys(obj)(對象自身的所有屬性,包括不可枚舉和Symbol)

  一個數組

  keys或者indexs(因為包含不可枚舉屬性,所有也會有'length')

  對象和數組

    let obj = {name:'shyno',age:18}
    let res =Reflect.ownKeys(obj)
    console.log(res)

  

    let arr =['L','O','V','E']
    let res =Reflect.ownKeys(arr)
    console.log(res)

因為這里並沒有給obj設置Symbol屬性,所有從打印結果來看和Object.getOwnPropertyNames(obj)是一樣的. 

 

總結:根據不同的遍歷需求選擇不同的方案,是否需要返回值,具體是要鍵還是值,這個函數適合數組還是對象,以及有沒有特殊性質的屬性等等.日常開發中很多只要考慮前三條就好了,適當選擇會一定程度上減少自己的代碼量. 

  

 

 

 

 

 

 

 


免責聲明!

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



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