我正在使用 JSLint 工具来确保我的JavaScript“严格”。
我收到以下错误但不明白如何修复它:
The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype
以下代码:
for (var i in keypairs) {
...
}
任何人都有任何想法如何修复它的JavaScript“严格”并且不会被JSLint标记
答案 0 :(得分:40)
如果keypairs
是一个数组,那么你应该重复遍历以下元素:
for(var i = 0; i < keypairs.length; i++) {
...
}
如果keypairs
是哈希值,那么JSLint正确地建议您检查是否在相应的密钥类型上运行(即,确认哈希值是预期的类型)
类似
for(var i in keypairs) {
if(keypairs.hasOwnProperty(i)) {
...
}
}
其中if验证无论什么标准确保您不访问原型函数等。
答案 1 :(得分:16)
它希望您使用hasOwnProperty
。
for (var i in keypairs) {
if(keypairs.hasOwnProperty(i))
{
// Use i
}
}
与JSLint相似,这是一个建议,其适用性取决于您的情况。如果对象的原型中存在不需要的enumerable属性,则非常有用。例如,如果您是使用某些JavaScript库。
答案 2 :(得分:5)
for...in
的问题在于您还将遍历原型的属性,并且大部分时间这不是您想要的。这就是为什么你应该用hasOwnProperty
测试属性:
for (var i in keypairs) {
if(keypairs.hasOwnProperty(i) {
//...
}
}
答案 3 :(得分:3)
for (var i in keypairs) {
if (keypairs.hasOwnProperty(i)) {
...
}
}
这是因为for
/ in
循环可能会迭代第三方库扩展的某些方法,例如如果有
Object.prototype.clone = function() { ... }
然后没有.hasOwnProperty()
条件,.clone
方法也会在...
中迭代。
这在http://yuiblog.com/blog/2006/09/26/for-in-intrigue/中进一步解释,从JSLint页面本身链接。
您可以通过选中“容忍未过滤”来关闭此警告。
答案 4 :(得分:0)
看看jslint自己的文档: http://www.jslint.com/lint.html 跳到
部分for in
他们执行以下操作:
for (name in object) { if (object.hasOwnProperty(name)) { .... } }