1

在下面的语句中,Object#hasOwnProperty()用于检查当前属性是否是对象实例的属性,而不是来自原型链。这意味着不管这种情况,for循环将遍历原型链中包含的整个属性列表。

for (key in obj) 
  if (obj.hasOwnProperty(key)) {
    iterator.call(context, obj[key], key);
  }
}

我想知道是否有办法摆脱这种行为并且通过对象实例的属性列表?


正如通过标签所提到的,我主要是问性能兴趣的问题。我之所以如此精确,是因为一个响应建议使用Object#getOwnPropertyNames(),但我看到的所有基准似乎都证明for…inwith hasOwnPropertyvsgetOwnPropertyNamesgetOwnPropertyNames. 例如:jsperf.com/for-in-vs-object-getownpropertynamesjsperf.com/for-in-vs-getownpropertynames-and-foreach/5

4

1 回答 1

0

Object.getOwnPropertyNames返回直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组。

所以你可以用这样for的东西替换那个循环:

Object.getOwnPropertyNames( obj ).forEach( function( key ){
    iterator.call(context, obj[key], key);
});

http://jsfiddle.net/fL2gH/

于 2013-10-28T15:32:20.370 回答