用hasOwnProperty检查遍历对象?

时间:2018-12-15 23:05:40

标签: javascript node.js

在循环中使用hasOwnProperty毫无意义,因为对象将始终具有属性?

例如:

const fruits = {
    apple: 28,
    orange: 17,
    pear: 54,
}

for (let property in fruits) {
    if (fruits.hasOwnProperty(property)) {
        console.log(fruits[property]);
    } 
}

1 个答案:

答案 0 :(得分:7)

如果您要处理的是一个不能从另一个对象继承的普通对象(例如您的问题中的代码),是的,则不需要进行检查。如果要从另一个对象继承继承的对象,它将很有用。例如:

const fruit = {
  isEdible: true
}
const apple = Object.create(fruit);
apple.color = 'green';

for (var property in apple) {
    if (apple.hasOwnProperty(property)) {
        console.log(apple[property]);
    } 
}

在这种情况下,需要进行hasOwnProperty检查,以确保仅for..in对象上的console.log属性仅在apple对象上直接循环-否则,对象apple继承的属性(即fruit)也将被打印:

const fruit = {
  isEdible: true
}
const apple = Object.create(fruit);
apple.color = 'green';

for (var property in apple) {
  console.log(apple[property]);
}

在大多数情况下,最好直接使用Object.keys(或Object.entriesObject.values)代替,这将直接遍历对象上的属性 (忽略继承的属性):

const fruit = {
  isEdible: true
}
const apple = Object.create(fruit);
apple.color = 'green';

Object.values(apple).forEach((value) => {
  console.log(value);
});

对于您的代码,该代码使用的是不继承自另一个对象的普通对象文字(除了Object之外,它没有任何可枚举的属性),它没有任何区别-< em>,但是功能性Object方法通常比for..in循环(许多linters禁止使用)循环要好得多