我有以下代码:
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将会中断.
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)
您还可以将循环重构为:
const keys = Object.keys(object);
for (const key of keys){
// do something with object[key];
}
Run Code Online (Sandbox Code Playgroud)