JavaScript可能的意外迭代

Pro*_*eus 60 javascript

我有以下代码:

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

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

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

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

你能更详细地解释一下这个陈述的含义吗?

Aln*_*tak 111

IDE建议您添加测试:

if (awards.hasOwnProperty(i)) {
    ...
}
Run Code Online (Sandbox Code Playgroud)

for循环内.

我个人建议不要这样做,并尽可能禁用警告.在大多数代码中根本不需要,甚至更少需要ES5代码,您可以使用ES5代码安全地向对象添加非可枚举属性Object.defineProperty

hasOwnProperty检查只需要如果你有不安全添加新的(枚举)属性Object.prototype,因此最简单的解决方法是不这样做.

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

  • 在IntelliJ 15中,要禁用警告,请执行以下操作:打开首选项 - >编辑器 - >代码样式 - >检查.在搜索框中,输入"hasOwnProperty".它将显示"Unfiltered for..in loop".取消选中该框.单击"确定"按钮接受更改并关闭窗口. (31认同)
  • 在 WebStorm 中,转到“文件...设置”,然后转到“编辑器”->“检查”->“JavaScript 和 TypeScript”->“常规”,然后取消选中“未过滤 for..in 循环”。 (3认同)
  • 在 IntelliJ 中:CTRL ALT S(除非您使用的 Ubuntu 有自己的 CTRL ALT S 快捷方式)只需搜索“hasOwnProperty”,您就会直接解决问题,取消选中它就完成了! (2认同)

Sel*_*M A 15

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

迭代对象时,它将迭代对象本身的属性和对象原型的属性.

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

for (var k in object) {
  if (object.hasOwnProperty(k)) {
     // do your computation here.
  }
}
Run Code Online (Sandbox Code Playgroud)

更多细节可以在这里找到


小智 14

您也可以摆脱编写 forEach 循环的警告,以获得更具可读性和功能性的方法:

Object.keys(object).forEach(key => {
    // Do something with object[key]
});
Run Code Online (Sandbox Code Playgroud)


Fla*_*ken 7

您还可以将循环重构为:

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