我有以下代码:
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文件。
您能否更详细地解释一下这句话的含义?
答案 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))