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

Com*_*ide 4 javascript

我试图了解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()检查,我们将始终遍历所有现有属性?

请注意,这个问题并不是真正的重复。

Duc*_*lan 6

文档表明:

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)

  • 我还为“hasOwnProperty”添加了注释:) (2认同)