我在我的JavaScript文件上使用了JSLint。它抛出错误:
for( ind in evtListeners ) {
第41行字符9的问题:for in的主体应该是 包装在if语句中以过滤不需要的 原型中的属性。
这是什么意思?
我在我的JavaScript文件上使用了JSLint。它抛出错误:
for( ind in evtListeners ) {
第41行字符9的问题:for in的主体应该是 包装在if语句中以过滤不需要的 原型中的属性。
这是什么意思?
当前回答
@all——JavaScript中的所有东西都是一个对象(),所以像“只在对象上使用这个”这样的语句有点误导人。此外,JavaScript不是强类型的,所以1 == "1"是真的(尽管1 === "1"不是真的,Crockford在这方面做得很好)。当涉及到JS中数组的编程概念时,类型在定义中很重要。
@Brenton -没有必要成为术语独裁者;“关联数组”,“字典”,“哈希”,“对象”,这些编程概念都适用于JS中的一个结构。它是name (key, index)值对,其中值可以是任何其他对象(字符串也是对象)
所以, new Array()与[]相同
new Object()大致类似于{}
var myarray = [];
创建一个数组结构,其中所有索引(即键)必须为整数。它还允许通过.push()自动分配新索引
var myarray = ["one","two","three"];
确实最好通过(初始化;条件;更新){处理
但是:
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]);
}
}
其他回答
这意味着您应该使用hasOwnProperty方法筛选evtlistener的属性。
老实说,添加一整行只是为了检查键是否存在,而使用应该迭代对象的键的语法会导致..无用的。只需使用Object.keys(obj)即可。替换为forEach(key => {})
坏的:(jsHint将抛出错误)
for (var name in item) {
console.log(item[name]);
}
好:
for (var name in item) {
if (item.hasOwnProperty(name)) {
console.log(item[name]);
}
}
瓦瓦的回答很中肯。如果使用jQuery,则使用$.each()函数处理这个问题,因此使用它更安全。
$.each(evtListeners, function(index, elem) {
// your code
});
首先,永远不要使用for in循环来枚举数组。从来没有。使用good old for(var i = 0;我< arr.length;我+ +)。
这背后的原因如下:JavaScript中的每个对象都有一个称为prototype的特殊字段。您添加到该字段的所有内容都将在该类型的每个对象上可访问。假设您希望所有数组都有一个很酷的名为filter_0的新函数,该函数将过滤掉0。
Array.prototype.filter_0 = function() {
var res = [];
for (var i = 0; i < this.length; i++) {
if (this[i] != 0) {
res.push(this[i]);
}
}
return res;
};
console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]
这是扩展对象和添加新方法的标准方法。很多库都这样做。 不过,现在让我们看看for in是如何工作的:
var listeners = ["a", "b", "c"];
for (o in listeners) {
console.log(o);
}
//prints:
// 0
// 1
// 2
// filter_0
你明白了吗?它突然认为filter_0是另一个数组索引。当然,它并不是真正的数字索引,而是用于枚举对象字段,而不仅仅是数字索引。所以我们现在枚举每个数字索引和filter_0。但filter_0不是任何特定数组对象的字段,现在每个数组对象都有这个属性。
幸运的是,所有对象都有一个hasOwnProperty方法,该方法检查该字段是否真的属于对象本身,或者它是否只是从原型链继承而来,因此属于该类型的所有对象。
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
请注意,尽管这段代码对数组可以正常工作,但永远不要使用for in和for each in for数组。请记住,for in枚举对象的字段,而不是数组索引或值。
var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
// happy