JavaScript可能的意外迭代

时间:2014-09-08 11:53:43

标签: javascript

我有以下代码:

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

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

  

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

     

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

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

5 个答案:

答案 0 :(得分:97)

IDE建议您添加测试:

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

for循环内。

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

安全地向对象添加非可枚举属性

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

jQuery不执行此测试 - 如果Object.prototype被不安全地修改,jQuery将会中断explicitly document

答案 1 :(得分:14)

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

当你遍历一个对象时,它会迭代对象本身的属性和对象原型的属性。

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

实施例

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

可以找到更多详细信息here

答案 2 :(得分:4)

您还可以将循环重构为:

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

答案 3 :(得分:3)

您也可以避免编写forEach循环的警告,以获得更易读和实用的方法:

var lpo=document.getElementsByClassName("class1");
    if(lpo.length>0)
    {
        lp=lpo[0];
    }
    var furl = "https://docs.google.com/forms/xyz/viewform? 
entry.811689367="+url+"&entry.436750636="+lp+"&entry.44062487=Yes";
window.open(furl); });

答案 4 :(得分:-1)

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

if (awards.hasOwnProperty(i))