JSLint一直抱怨这样的事情
var myArray = [1, 2, 3];
for (var value in myArray)
{
// BLAH
}
说我应该把它包装在if语句中。我意识到如果你在一个对象的属性上循环,你需要包装它,但是我应该在if语句中放置什么来进行正确的过滤。
此外,当我做
之类的事情时for (var i = 0; i < 10; i++)
{
// foo
}
for (var i =0; i < 20; i++)
{
// bar
}
它抱怨我已被定义。除了使用不同的变量名之外,我该如何防止这种情况?
答案 0 :(得分:9)
JSLint发出了许多并不是真正有害的东西。在这种情况下,抱怨for...in
是正确的,因为这是循环数组的错误构造。
这是因为您不仅会获得数字键,还会获得已添加到数组或其Array.prototype中的任何其他任意属性。后者通常来自框架添加的扩展实用程序功能。
虽然你可以用hasOwnProperty
打败这个案例来检查它不是一个原型成员,但这比用for (var i= 0...)
正确的做法更加丑陋,所以为什么要这么麻烦。
此外,对于for...in
,您不一定会按照您的预期按数字顺序获取项目。
它抱怨我已被定义。除了使用不同的变量名之外,我该如何防止这种情况?
是的,你可以忽略那一个。
它希望您从第二个var
中删除for (i...
,因为在同一范围内声明两次变量不会执行任何操作。但是我建议将var
留在那里,因为它没有任何伤害,如果你将循环移动到另一个块,你不希望它突然在全局上涂鸦。
答案 1 :(得分:8)
真的,你不必听jslint。但如果你真的想要传递(这很好)你可能会这样做:
var myArray = [1, 2, 3];
for (var value in myArray)
{
if (myArray.hasOwnProperty(value)) {
// BLAH
}
}
对于第二部分,您必须将它们放在函数中或使用不同的变量。另一种解决方案是第二次使用i
而不是var i
,因为它已经定义了......
答案 2 :(得分:4)
如果查看JSLint文档,您将找到一个解释the rationale behind filtering for-in loops的链接:基本上,它是为了避免绊倒已添加到对象原型的任何可枚举属性。 (尽管你不应该使用for-in来迭代数组。)
在第二种情况下,您将变量声明两次:变量在JavaScript中具有函数作用域(或全局作用域)。 Douglas Crockford,以及JSLint,认为最好只为变量所在的范围声明变量一次:
var i;
for (i = 0; i < 10; i++)
{
// foo
}
for (i =0; i < 20; i++)
{
// bar
}
答案 3 :(得分:0)