Javascript JSLint错误是什么';for-in的主体应封装在if语句中';什么意思?
我用在我的一个JavaScript文件上。它抛出了错误: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》的作者曾多次就这个问题撰写(和发表)文章。他的网站页面上有一个部分介绍了这一点: 对
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]);
}
}