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