我在我的JavaScript文件上使用了JSLint.它抛出错误:

for( ind in evtListeners ) {

第41行的问题第9字符:for in的主体应该是

这是什么意思?

推荐答案

首先,never使用for in循环对数组进行枚举.从不使用好的老for(var i = 0; i<arr.length; i++).

这背后的原因如下:JavaScript中的每个对象都有一个名为prototype的特殊字段.您添加到该字段的所有内容都将在该类型的每个对象上进行访问.假设您希望所有数组都有一个名为filter_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]

这是扩展对象和添加新方法的标准方法.很多图书馆都这样做.

var listeners = ["a", "b", "c"];
for (o in listeners) {
    console.log(o);
}
//prints:
//  0
//  1
//  2
//  filter_0

你看到了吗?它突然认为filter_0是另一个数组索引.当然,它不是真正的数字索引,而是通过对象字段枚举for in,而不仅仅是数字索引.所以我们现在列举每一个数字索引and filter_0.但是filter_0不是任何特定数组对象的字段,现在每个数组对象都有这个属性.

幸运的是,所有对象都有一个hasOwnProperty方法,它判断这个字段是否真的属于对象本身,或者它是否只是从原型链继承的,因此属于该类型的所有对象.

for (o in listeners) {
    if (listeners.hasOwnProperty(o)) {
       console.log(o);
    }
}
 //prints:
 //  0
 //  1
 //  2

请注意,尽管这段代码对数组的作用与预期的一样,但您永远不应该使用neverfor each in来表示array.请记住,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

Javascript相关问答推荐

JavaScript代理不适用于打开的窗口对象

验证嵌套 colored颜色 代码的结果

如何按预期聚合SON数据?

一次仅播放一个音频

有什么(最佳)方法可以从模块中获取脚本模块的多姆元素吗?

是什么原因导致此Angular 16应用程序中类型错误时属性结果不存在?

角色 map 集/spritebook动画,用户输入不停止在键上相位器3

从WooCommerce Checkout Country字段重新排序国家,保持国家同步

自定义高图中的x轴标签序列

将本机导航路由react 到导航栏中未列出的屏幕?

Html文件和客户端存储的相关问题,有没有可能?

当id匹配时对属性值求和并使用JavaScript返回结果

本地库中的chartjs-4.4.2和chartjs-plugin-注解

如何将未排序的元素追加到数组的末尾?

MongoDB受困于太多的数据

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

判断函数参数的类型

Socket.IO在刷新页面时执行函数两次

为什么我看到的是回复,而不是我的文档?

ReferenceError:无法在初始化之前访问setData