JavaScript可能的意外迭代

JavaScript Possible Iteration Over Unexpected

本文关键字:意外 迭代 JavaScript      更新时间:2023-09-26

我有以下代码:

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

我的IDE显示了与上面代码相关的错误:

可能对意外(自定义/继承)成员进行迭代,可能缺少hasOwnProperty检查

在JavaScript中检查未筛选的in循环的任何实例。这个使用此构造会导致处理继承的或意外的属性。您需要使用hasOwnProperty()筛选自己的属性方法验证工作在JavaScript、html或jsp文件中。

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

IDE建议您添加一个测试:

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

在CCD_ 1循环内。

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

只有当您不安全地向Object.prototype添加了新的(可枚举的)属性时,才需要进行hasOwnProperty检查,因此最简单的解决方案是不要这样做

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

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

当您对对象进行迭代时,它将迭代对象本身的属性和对象原型的属性。

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

示例

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

更多详细信息可以在这里找到

您还可以将循环重构为:

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

此外,您还可以通过编写forEach循环来消除警告,从而获得更可读、更实用的方法:

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

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

if (awards.hasOwnProperty(i))