几种遍历方式的比较

主要从几个方面讨论

   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)是一样的. 

总结:根据不同的遍历需求选择不同的方案,是否需要返回值,具体是要键还是值,这个函数适合数组还是对象,以及有没有特殊性质的属性等等.日常开发中很多只要考虑前三条就好了,适当选择会一定程度上减少自己的代码量. 

  

 

 

 

猜你喜欢

转载自www.cnblogs.com/Shyno/p/12163079.html