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