意外情况下可能的 JavaScript 迭代

我有以下密码:

  for (i in awards) {
if (awards[i] instanceof Array === false) {
console.log(awards[i]);
httpFactory.patch(awards[i], {"read": true}, false);
}
}

My IDE shows this error relating to the code above:

对意外(自定义/继承)成员进行可能的迭代, 可能丢失了一张“拥有财产”的支票

Checks for any instances of unfiltered for-in loops in JavaScript. The 使用此构造会导致处理继承的或意外的 您需要使用 hasOwnProperty ()筛选自己的属性 验证工作在 JavaScript、 html 或 jsp 文件中。

你能更详细地解释一下这句话的意思吗?

54994 次浏览

Every object in javascript has prototype which has its own properties(native/inherited methods/properties) and properties which are directly attached to object itself.

当您在一个对象上迭代时,它将迭代该对象本身的属性和该对象的原型的属性。

因此,为了避免在原型上迭代,建议使用 HasOwnProperty方法,只有当对象直接具有上述属性时才返回 true。也就是说,不在原型内部

例子

for (var k in object) {
if (object.hasOwnProperty(k)) {
// do your computation here.
}
}

更多细节可以找到 给你

您应该在这个循环的开始处再添加一个条件

if (awards.hasOwnProperty(i))

IDE 建议您添加一个测试:

if (awards.hasOwnProperty(i)) {
...
}

inside the for loop.

我个人建议不要这样做,并在可能的情况下禁用警告。在大多数代码中根本不需要,在 ES5代码中更不需要,因为在 ES5代码中可以使用 Object.defineProperty安全地向对象添加不可枚举属性

只有在向 Object.prototype添加了不安全的新(可枚举)属性时,才需要进行 hasOwnProperty检查,因此最简单的修复方法是 别这样

jQuery doesn't perform this test - they 明确的文件 that jQuery will break if Object.prototype is unsafely modified.

还可以将循环重构为:

const keys = Object.keys(object);
for (const key of keys){
// do something with object[key];
}

另外,您还可以去掉警告,编写一个 forEvery 循环来实现更具可读性和功能性的方法:

Object.keys(object).forEach(key => {
// Do something with object[key]
});