JavaScript:JSLint 错误“for in 的主体应包含在 if 语句中以过滤原型中不需要的属性”
Posted
技术标签:
【中文标题】JavaScript:JSLint 错误“for in 的主体应包含在 if 语句中以过滤原型中不需要的属性”【英文标题】:JavaScript: JSLint error "The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype" 【发布时间】:2011-05-09 04:03:38 【问题描述】:我正在使用 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 标记
【问题讨论】:
【参考方案1】:如果keypairs
是一个数组,那么您真的应该遍历以下元素:
for(var i = 0; i < keypairs.length; i++)
...
如果keypairs
是一个散列,那么 JSLint 正确地建议您检查您是否在适当的键类型上进行操作(即确认散列是预期的类型)
有点像
for(var i in keypairs)
if(keypairs.hasOwnProperty(i))
...
if 验证任何标准以确保您没有访问原型函数等。
【讨论】:
+1,请注意:数组迭代的更好模式是for (var i = 0, l = keypairs.length; i < l; ++i) ...
。由于局部变量的查找开销较小(相对于长度属性),这会稍微快一些。这也是 CoffeeScript 会生成的 :-)。【参考方案2】:
它希望你使用hasOwnProperty
。
for (var i in keypairs)
if(keypairs.hasOwnProperty(i))
// Use i
与 JSLint 的大部分内容一样,这是一个建议,其适用性取决于您的具体情况。如果对象的原型中有不想要的enumerable 属性,这很有用。如果您例如,这可能就是这种情况。使用某些 JavaScript 库。
【讨论】:
【参考方案3】:for...in
的问题在于,您还将遍历原型的属性,而且大多数时候这不是您想要的。这就是为什么您应该使用hasOwnProperty
测试该属性:
for (var i in keypairs)
if(keypairs.hasOwnProperty(i)
//...
【讨论】:
【参考方案4】:for (var i in keypairs)
if (keypairs.hasOwnProperty(i))
...
这是因为for
/in
循环可能会迭代由 3rd 方库扩展的某些方法,例如如果有一个
Object.prototype.clone = function() ...
那么如果没有.hasOwnProperty()
条件,.clone
方法也会在...
中迭代。
这在http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ 中有进一步解释,链接自 JSLint 页面本身。
您可以通过选中“Tolerate unfiltered for in”来关闭此警告。
【讨论】:
【参考方案5】:看看 jslint 自己的文档: http://www.jslint.com/lint.html 跳转到该部分
在
他们执行以下操作:
for (name in object) if (object.hasOwnProperty(name)) ....
【讨论】:
以上是关于JavaScript:JSLint 错误“for in 的主体应包含在 if 语句中以过滤原型中不需要的属性”的主要内容,如果未能解决你的问题,请参考以下文章
带有闭包的 JavaScript For 循环导致 JSLint 警告
无法使用内联代码删除 Aptana 中的 Javascript JsLint 错误