循环数组时的原型对象?

时间:2013-10-21 07:30:26

标签: javascript jquery arrays prototype

循环遍历数组时,我的结果令人困惑。

填充数组看起来像

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

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

时,程序会中断
for (t in tables) {
    var t = tables[t];
    t.removeClass(...);
}

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

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

我已经读过,每个javascript对象都带有一个prototype属性,但为什么原型在这里被视为一个对象?

2 个答案:

答案 0 :(得分:1)

注意:如果您的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类的原型。这是generally seen as bad practice。这样做使属性可枚举更糟糕。您应该考虑删除或修复您使用的库。

答案 1 :(得分:0)

您对表格的声明应该是:

var tables = {};