迭代属性需要以下额外检查:hasOwnProperty
for (var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
// do stuff
}
}
这是必要的,因为对象的原型包含对象的其他属性,这些属性在技术上是对象的一部分。这些附加属性继承自基对象类,但仍然是 的属性。obj
hasOwnProperty
只是检查这是否是特定于此类的属性,而不是从基类继承的属性。
也可以通过对象本身调用:hasOwnProperty
if (obj.hasOwnProperty(prop)) {
// do stuff
}
但是,如果对象具有具有相同名称的不相关字段,则此操作将失败:
var obj = { foo: 42, hasOwnProperty: 'lol' };
obj.hasOwnProperty('foo'); // TypeError: hasOwnProperty is not a function
这就是为什么通过它来调用它更安全的原因:Object.prototype
var obj = { foo: 42, hasOwnProperty: 'lol' };
Object.prototype.hasOwnProperty.call(obj, 'foo'); // true