拥有此代码
var a = {date : 12};
for(var t in a){
alert(t);
}
我有一个带有日期属性的警报。
但无处不在(即here)我发现需要写:
for (var property in object) {
if (object.hasOwnProperty(property)) {
// do stuff
}
}
那么为什么我没有看到对象的内部属性呢?
答案 0 :(得分:0)
在JavaScript中存在'原型链',一种继承形式。如果您要将属性添加到a
的原型中,然后将date
属性直接添加到a
,那么您的for
循环将找到这两个属性。
hasOwnProperty
检查当前属性是否已直接附加到上下文对象,或者是否已通过原型链继承。
因此,在我的示例中,如果您已经向a
的原型添加了属性,那么hasOwnProperty
条件将返回false并且您不会t"做东西"用它。
答案 1 :(得分:0)
for..in语法迭代对象的每个属性,包括在原型链上找到的属性(如果它们是可枚举的)。这通常不是您想要的,因此通常建议hasOwnProperty
检查。
在你的情况下,它没有必要,因为你的普通对象不会从Object原型(它的原型链中唯一的东西)继承任何可枚举的属性。
另外,for..in为您提供了对象的属性 names (键),如果您对该特定属性的值感兴趣,则必须使用括号表示法,将您的示例扩展到:
var a = {date : 12};
for(var t in a){
alert(a[t]);
}
答案 2 :(得分:0)
我想看到它的最好方法是通过一个例子:
Object.prototype.aBaseProperty = 123;
var childObject = { date: 12 };
for (var property in childObject) {
console.log(property)
}
// output: date aBaseProperty
for (var property in childObject) {
if (childObject.hasOwnProperty(property)) {
console.log(property)
}
}
// output: date
答案 3 :(得分:0)
此外,您可能不愿意进行hasOwnProperty
检查,而是
Object.keys(object).forEach(function(value, key) { ... });
Object.keys
只返回自己的属性。