在JavaScript中迭代对象键时使用“hasOwnProperty()”是否有好处

时间:2017-09-29 00:54:14

标签: javascript

我试图理解在迭代对象键时使用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) 检查,我们将始终遍历所有现有属性吗?

请注意,这个问题实际上并不重复。

1 个答案:

答案 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');

所以你需要使用:

,