1

有时当我调用此对象的方法时,我收到“糟糕”错误,因为“i”指的是不存在的属性。怎么可能?

m.derp();
m.herp(); // Sometimes throws error

方法:

this.movements = new Array();
this.herp = function() {
    for (var i in this.movements) {
        if (!(this.movements[i] instanceof Movement)) {
            throw new Error("Oops"); // this.movements[i] is undefined
        }
    }
}
this.derp = function() {
    var newArray = new Array();
    for (var i in this.movements) {
        if (!this.movements[i].isFinished()) {
            newArray.push(this.movements[i]);
        }
    }
    this.movements = newArray;
}
4

3 回答 3

3

对于数组,您不应该使用for-in. 它是一个通用枚举器,包括所有可枚举属性,包括通过原型继承的属性。

你应该做这个...

for (var i = 0; i < this.movements.length; i++) {

Array.prototype添加到或Object.prototype将在使用时遇到的任何属性for-in

如果您只想要数字索引,那么该for语句就是要使用的正确语句。...除非在某些狭窄的情况下,如下面的 TJ Crowder 所述。

于 2012-07-05T22:34:50.933 回答
1

通常,您不应该将for-in其用于数组 - 该构造更多地用于对象。使用传统for循环:

for (var i=0, len=this.movements.length; i<len; i++) //do stuff...

有关为什么会这样的更多信息,请参阅此问题

于 2012-07-05T22:35:13.740 回答
1

你不应该使用 for in 来迭代一个数组,因为实际上你正在迭代一个数组对象的每个属性,还有那些被继承的(我不确定是否有)。使用简单的循环:

for(var i = 0; i < arr.length; i++){

}
于 2012-07-05T22:35:56.583 回答