为什么Object.keys比hasOwnProperty更快?

men*_*oic 14 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]];
}
Run Code Online (Sandbox Code Playgroud)

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

为什么是这样?

Ber*_*rgi 54

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

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

  • 您的答案简洁明了. (5认同)

Gov*_*Rai 5

该线程中的大多数测试显示hasownpropertyObject.keys(). 但是,对于这些测试,要循环的属性数量很少(<20 个属性)。

只要对象属性的数量很大(没有确切的数字,超过 100 个键的测试显示Object.keys()为明显的赢家),就会Object.keys()击败它。

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