循环遍历数组时的原型对象

Prototype object when looping through array?

本文关键字:原型 对象 遍历 数组 循环      更新时间:2023-09-26

我在循环数组时得到令人困惑的结果。

填充数组看起来像

var tables = [];
// ...
// t is table as jQuery object
tables[t.attr('id')] = t;

稍后,当循环遍历表数组时,我得到的元素比实际添加的多一个。当另一个对象到达 t.removeClass() 时程序中断

for (t in tables) {
    var t = tables[t];
    t.removeClass(...);
}

Visual Studio Debugger将另一个对象描述为"克隆",这是原型对象/属性(?)的第一种方法。

tables
    [prototype]
        [Methods]
            clone
            ...
        [prototype]
    MyTable0
    MyTable1

我读过每个javascript对象都带有原型属性,但是为什么这里的原型被视为对象?

注意:如果你的id不是数字,那么你不需要数组,看看另一个答案。

若要遍历数组,请不要使用 for..in 构造。

for (var i=0; i<tables.length; i++) {
    var t = tables[i];
    t.removeClass(...);
}

或者如果你不关心IE8:

tables.forEach(function(t) {
    t.removeClass(...);
});

或使用 jQuery :

$.each(tables, function(_,t){
    t.removeClass(...);
});

旁注:看起来有人很差地丰富了本机 Array 类的原型。这通常被视为不好的做法。这样做并使属性可枚举甚至更糟。您应该考虑删除或修复您使用的库。

表的声明应为:

var tables = {};