各种遍历的性能 - pod4g/tool GitHub Wiki

今天在群里司徒正美说Object.keys(obj).map(key => handle(obj[key], key)) 很慢,我觉得Object.keys不会慢,慢的是map,经过测试,果然验证了想法

var arr = [];

  for(var i = 0;i<1000000;i++){
    arr.push(i);
  }

  console.time("map")
  Object.keys(arr).map(v => {
  })
  console.timeEnd("map")

  console.time("forEach")
  Object.keys(arr).forEach(v => {
  })
  console.timeEnd("forEach")

  console.time("for in") 
  Object.keys(arr).map(v => {
  })
  console.timeEnd("for in")
  
  console.time("for")
  for(var j = 0,l = arr.length; j < l ;j++){

  }
  console.timeEnd("for")

  // Object.keys 和 forin & hasOwnproperty
  console.time("Object.keys")
  Object.keys(arr);
  console.timeEnd("Object.keys")

  console.time("forin and hasOwnProperty")
  for(var attr in arr){
    if(arr.hasOwnProperty(attr)){

    }
  }
  console.timeEnd("for in and hasOwnProperty")

测试结果:

map: 588.795ms
forEach: 142.258ms
for in: 618.811ms
for: 14.412ms
Object.keys: 109.387ms
forin and hasOwnProperty: 255.698ms
Object.keys and for: 129.253ms

可以得出结论(性能由高到底排列):

for > forEach > map > forin

forin and hasOwnProperty > Object.keys

最快地替代forin and hasOwnProperty的方案为:

Object.keys and for