我试图理解在迭代对象键时使用hasOwnProperty()
检查的目标。据我所知,在两种情况下都会对每个对象属性执行迭代(不是更多,而不是更少):使用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);
检查和不检查的结果是相同的:
hasOwnProperty()
所以我的问题是:为什么以及何时应该使用hasOwnProperty()
检查?
我会重新解释一下我的问题:如果没有irounddigits = int(input('how many digits you want to round to'))
stype = input('do you have a float(f) or a fraction(dp)(please select one)')
if stype == "f":
rtoberounded = float(input('enter the number your want to round'))
print (round(rtoberounded[`irounddigits]))
else:
inumerator = int(input(' what is your numerator(integer please)'))
idemoninator = int(input(' what is your demoninaotr(integer please)'))
ffinalnumber = inumerator / idemoninator
rnumber = (round(ffinalnumber[irounddigits]))
print (rnumber)
检查,我们将始终遍历所有现有属性吗?
请注意,这个问题实际上并不重复。
答案 0 :(得分:4)
文档表明:
hasOwnProperty()方法返回一个布尔值,指示是否 object将指定的属性作为自己的(不是继承的)属性。
const obj = {
prop1: [],
prop2: {},
prop3: "",
prop4: 0,
prop5: null,
prop6: undefined
}
obj.prototype = {foo: 'bar'};
方法确保您检查的属性直接在对象的实例上,但不从其原型链继承。如果你不检查,它将循环遍历原型链上的每个属性。
hasOwnProperty
P / s:注意:
JavaScript不保护属性名称hasOwnProperty
;因此,如果存在对象可能具有此名称的属性的可能性,则必须使用外部var foo = {
hasOwnProperty: function() {
return false;
},
bar: 'Here be dragons'
};
foo.hasOwnProperty('bar'); // always returns false
来获得正确的结果:
Object.prototype.hasOwnProperty.call(foo, 'bar');
所以你需要使用:
,