为什么Object.keys比hasOwnProperty更快?

时间:2015-05-19 13:02:52

标签: javascript performance

 // hasOwnProperty approach 
 for (key in obj) {
  if (obj.hasOwnProperty(key)) {
    value = obj[key];
  }
}

// Object.keys approach 
keys = Object.keys(obj);
for (i = 0, l = keys.length; i < l; i++) {
  value = obj[keys[i]];
}

根据jsperf,Object.keys方法快50%+ http://jsperf.com/object-keys-vs-hasownproperty/45

为什么会这样?

2 个答案:

答案 0 :(得分:50)

  • Object.keys查找所有拥有的可枚举的属性(哦,数组很快)。
  • for in还会查找继承的可枚举属性,而不仅仅是自己的属性
  • for in + hasOwnProperty另外测试所有已查找的属性,看它们是否属于自己的属性。

即使没有继承的可枚举属性,仍然需要做更多工作。

答案 1 :(得分:3)

该主题中的大多数测试都显示hasownpropertyObject.keys()更快。然而,对于那些测试,循环的特性量很小(<20个特性)。

只要对象属性的数量很大(没有确切的数字,使用&gt; 100个键的测试显示Object.keys()作为明显的赢家),Object.keys()就会胜过它。

https://jsperf.com/object-keys-vs-hasownproperty/55。您可以转到页面底部查看测试的所有修订。