在以下语句中,Object#hasOwnProperty()
用于检查当前属性是否是对象实例的属性,而不是原型链的属性。这意味着永远不要处理这种情况,for
循环将遍历原型链中包含的整个属性列表。
for (key in obj)
if (obj.hasOwnProperty(key)) {
iterator.call(context, obj[key], key);
}
}
我想知道是否有办法摆脱这种行为,只遍历对象实例的属性列表?
正如通过标签所提到的,我主要是提出表现兴趣的问题。我正在制定这种精确度,因为一个回复建议使用Object#getOwnPropertyNames()
,但我看到的所有基准似乎都证明for…in
hasOwnProperty
与getOwnPropertyNames
相比getOwnPropertyNames
非常不利}}。例如:jsperf.com/for-in-vs-object-getownpropertynames或jsperf.com/for-in-vs-getownpropertynames-and-foreach/5
答案 0 :(得分:0)
Object.getOwnPropertyNames
返回直接在给定对象上找到的所有属性(可枚举或不可枚举)的数组。
所以你可以用这样的东西替换for
循环:
Object.getOwnPropertyNames( obj ).forEach( function( key ){
iterator.call(context, obj[key], key);
});