Javascript JSLint错误是什么';for-in的主体应封装在if语句中';什么意思?

Javascript JSLint错误是什么';for-in的主体应封装在if语句中';什么意思?,javascript,jslint,Javascript,Jslint,我用在我的一个JavaScript文件上。它抛出了错误: for( ind in evtListeners ) { 第41行的问题字符9:for in的主体应为 包装在if语句中以筛选不需要的 原型的属性 这意味着什么?这意味着您应该使用过滤evtListeners的属性。首先,绝不使用for in循环在数组上枚举。从未。使用良好的旧for(var i=0;iDouglas Crockford,《jslint》的作者曾多次就这个问题撰写(和发表)文章。他的网站页面上有一个部分介绍了这一点: 对

我用在我的一个JavaScript文件上。它抛出了错误:

for( ind in evtListeners ) {
第41行的问题字符9:for in的主体应为 包装在if语句中以筛选不需要的 原型的属性


这意味着什么?

这意味着您应该使用过滤evtListeners的属性。

首先,绝不使用
for in
循环在数组上枚举。从未。使用良好的旧
for(var i=0;iDouglas Crockford,《jslint》的作者曾多次就这个问题撰写(和发表)文章。他的网站页面上有一个部分介绍了这一点:

对于语句

for类语句应该具有 以下表格:

for (initialization; condition; update) {
    statements
}

for (variable in object) {
    if (filter) {
        statements
    } 
}
第一种形式应与 具有循环的数组和 预先确定的迭代次数

第二种形式应与 对象。请注意 添加到的原型中 对象将包含在 枚举。编程是明智的 通过使用 hasOwnProperty方法用于区分 对象的真实成员:

for (variable in object) {
    if (object.hasOwnProperty(variable)) {
        statements
    } 
}

Crockford还有一个关于YUI剧院的视频系列,他在那里谈到了这一点。Crockford的一系列关于javascript的视频/讨论是一个必须看你是否对javascript有一点认真。

Vava的答案是正确的。如果你使用jQuery,那么
$。each()
函数会处理这个问题,因此使用起来更安全

$.each(evtListeners, function(index, elem) {
    // your code
});

说起来肯定有点极端

…切勿使用for in循环来 在数组上枚举。从不。使用 好的旧的(var i=0;
我@all-JavaScript中的所有内容都是一个对象(),因此“仅在对象上使用此项”之类的语句有点误导。此外,JavaScript不是强类型的,因此1==“1”是真的(尽管1==“1”不是真的,但Crockford在这一点上很重要)。当谈到JS中数组的Programmatic概念时,键入在定义中很重要

@Brenton-无需成为术语独裁者;“关联数组”、“字典”、“哈希”、“对象”,这些编程概念都适用于JS中的一个结构。它是名称(键、索引)值对,其中值可以是任何其他对象(字符串也是对象)

所以,
new Array()
[]

newobject()
{}

var myarray = [];
创建一个数组结构,限制所有索引(也称为键)必须为整数。它还允许通过.push()自动分配新索引

最好通过(初始化;条件;更新){

但是关于:

var myarray = [];
myarray[100] = "foo";
myarray.push("bar");
试试这个:

var myarray = [], i;
myarray[100] = "foo";
myarray.push("bar");
myarray[150] = "baz";
myarray.push("qux");
alert(myarray.length);
for(i in myarray){
    if(myarray.hasOwnProperty(i)){  
        alert(i+" : "+myarray[i]);
    }
}
也许这不是数组的最佳用法,但它只是一个例子,说明事情并不总是清晰的

如果您知道键,并且肯定知道键不是整数,那么唯一类似数组的结构选项就是对象

var i, myarray= {
   "first":"john",
   "last":"doe",
   100:"foo",
   150:"baz"
};
for(i in myarray){
    if(myarray.hasOwnProperty(i)){  
        alert(i+" : "+myarray[i]);
    }
}

为了补充for in/for/$的主题,我添加了一个使用$的jsperf测试用例。每个vs for in:

不同的浏览器/版本处理它的方式不同,但它似乎是$。每种浏览器/版本都是最便宜的性能选择

如果您使用for-in在关联数组/对象中进行迭代,并且知道您在追求什么,而忽略其他所有内容,那么使用$。如果您使用jQuery,则使用$。each,或者仅使用for-in(然后使用一个break;一旦达到您知道的内容,则应使用$作为最后一个元素)

如果您正在迭代数组以使用其中的每个密钥对执行某些操作,如果您不使用jQuery,则应使用hasOwnProperty方法,如果您使用jQuery,则应使用$.each

始终使用
for(i=0;iBad:(jsHint将抛出错误)

好:


您不应该使用
for in
在数组上进行迭代,因为该语言不支持
for in
在数组上的枚举顺序。它可能不是数字顺序。此外,如果使用`for(i=0;iThanks!我将把它保存为引用。我发现自己再次查看了这个答案,因为我确信这一点JSLint被破坏了。我的代码大致是:for(o in listeners){if(listeners.hasOwnProperty(i)){console.log(o);}问题是我有一个bug,我将变量名I切换为o,并错过了一个引用。JSLint足够聪明,可以确保您在正确的对象上检查hasOwnProperty的正确属性。但是,for in可以迭代对象的属性。OP从未说过for in应用于数组。hasOwnProperty I但是,在某些情况下,您不希望使用它,例如,如果一个对象扩展了另一个对象,您希望同时列出对象和“父”对象的属性。我认为,与其让人们害怕in
循环(顺便说一下,这非常棒),不如教育他们如何工作(在本回答中正确完成)并将他们介绍给,以便他们可以安全地扩展其原型而不破坏任何东西。顺便说一句,扩展本机对象的原型不应该在没有
对象的情况下进行。defineProperty
。您非常困惑。没有“关联数组”这样的东西在javascript中。这是严格意义上的php概念。这些对象确实没有
length
属性,但您可以用另一种方法来实现:
var myArr=[];myArr['key1']='hello';myArr['key2']='world';
@Nyuszika7H这是错误的方法。如果您不需要整数索引数组,那么就不应该使用
var myArr=[]
,应该是
var myArr={}
在PHP中它们是相同的东西,但在JS中不是。关联的“数组”不是数组。如果性能是任何考虑因素,我不建议在这里使用
$。如果您可以为
loo使用原始
,则每个
(或下划线.JS的
\uu.each
var i, myarray= {
   "first":"john",
   "last":"doe",
   100:"foo",
   150:"baz"
};
for(i in myarray){
    if(myarray.hasOwnProperty(i)){  
        alert(i+" : "+myarray[i]);
    }
}
for (var name in item) {
    console.log(item[name]);
}
for (var name in item) {
  if (item.hasOwnProperty(name)) {
    console.log(item[name]);
  }
}