// 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 方法比 hasOwnProperty 方法快50%以上。http://jsperf.com/object-keys-vs-hasownproperty/45为什么会出现这种情况呢?
keys = Object.keys(obj); value = obj[keys[keys.length - 1]];
绕过了你的循环。在第一个测试中,它会在每个循环中进行一次检查,而第二个测试只是用值填充变量。 - Hacketofor in
循环需要比Object.keys
做更多的工作,此外,过滤hasOwnProperty
更是更加繁琐的工作。 - BergiObject.keys
只被调用一次,而hasOwnProperty
被调用多次(每个可枚举属性和每个不可枚举属性都会调用一次)。更多的函数调用意味着更慢的代码。此外,Object.keys
是一个本地函数。因此,很有可能比JavaScript shim更快。 - Aadit M Shah[]
检查“truthy”值比使用in
或hasOwnProperty
快得多。 - icl7126