JavaScript 可能迭代意外

2022-08-30 05:11:58

我有以下代码:

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

我的IDE显示与上述代码相关的此错误:

可能迭代意外(自定义/继承)成员,可能缺少 hasOwn属性检查

检查 JavaScript 中未过滤的 for-in 循环的任何实例。使用此构造会导致处理继承的或意外的属性。您需要使用 hasOwnProperty() 方法过滤自己的属性。验证适用于 JavaScript、html 或 jsp 文件。

您能更详细地解释一下这句话的含义吗?


答案 1

IDE 建议您添加一个测试:

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

在循环内部。for

我个人建议不要这样做,如果可能的话,禁用警告。在大多数代码中根本不需要,在ES5代码中甚至更少需要,您可以使用Object.defineProperty

仅当您以不安全的方式向 中添加了新的(可枚举)属性时,才需要进行检查,因此最简单的解决方法是不要这样做hasOwnPropertyObject.prototype

jQuery不执行此测试 - 他们明确记录了如果被不安全地修改,jQuery将中断。Object.prototype


答案 2

javascript中的每个对象都有原型,它有自己的属性(本机/继承的方法/属性)和直接附加到对象本身的属性。

循环访问对象时,它将循环访问对象本身的属性和对象原型的属性。

因此,为了避免迭代原型,建议使用 hasOwnProperty 方法,该方法仅在对象直接具有上述属性时才返回 true。即不在原型内部

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

更多细节可以在这里找到