我试图了解hasOwnProperty()在迭代对象键时使用check的目标。据我所知,在两种情况下,都会为每个对象属性(不是更多,也不是更少)执行迭代:有hasOwnProperty()或没有。例如,在下面的代码中,带hasOwnProperty()检查和不带检查的结果是一样的:
const obj = {
prop1: [],
prop2: {},
prop3: "",
prop4: 0,
prop5: null,
prop6: undefined
}
const resultWithHasOwnProperty = [];
const resultWithoutHasOwnProperty = [];
for(key in obj) {
if(obj.hasOwnProperty(key)) {
resultWithHasOwnProperty.push(obj[key])
}
}
for(key in obj) {
resultWithoutHasOwnProperty.push(obj[key])
}
console.log("Result WITH hasOwnProperty check: ", resultWithHasOwnProperty);
console.log("Result WITHOUT hasOwnProperty check: ", resultWithoutHasOwnProperty);Run Code Online (Sandbox Code Playgroud)
所以我的问题是:为什么以及何时应该使用hasOwnProperty()检查?
我将重新表述我的问题:如果不hasOwnProperty()检查,我们将始终遍历所有现有属性?
请注意,这个问题并不是真正的重复。
文档表明:
hasOwnProperty() 方法返回一个布尔值,指示对象是否具有作为自己(非继承)属性的指定属性。
该 hasOwnProperty 方法确保您正在检查的属性直接在对象的实例上,而不是从其原型链继承。如果不检查,它将遍历原型链上的每个属性。
const obj = {
prop1: [],
prop2: {},
prop3: "",
prop4: 0,
prop5: null,
prop6: undefined
}
obj.prototype = {foo: 'bar'};
Run Code Online (Sandbox Code Playgroud)
P/s:请注意:
JavaScript 不保护属性名称 hasOwnProperty ;因此,如果对象可能具有具有此名称的属性的可能性存在,则有必要使用外部 hasOwnProperty 来获得正确的结果:
var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // always returns false
Run Code Online (Sandbox Code Playgroud)
所以你需要使用:
Object.prototype.hasOwnProperty.call(foo, 'bar');
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1379 次 |
| 最近记录: |