主要从几个方面讨论
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)是一样的.
总结:根据不同的遍历需求选择不同的方案,是否需要返回值,具体是要键还是值,这个函数适合数组还是对象,以及有没有特殊性质的属性等等.日常开发中很多只要考虑前三条就好了,适当选择会一定程度上减少自己的代码量.
浙公网安备 33010602011771号