Javascript for ..有时通过不存在的属性

Javascript for...in sometimes goes through unexisted attribute

本文关键字:不存在 属性 for Javascript      更新时间:2023-09-26

有时当我调用这个对象的方法时,我得到"哎呀"错误,因为"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;
}

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

你应该这样做...

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

使用 for-in 时,将遇到添加到Array.prototypeObject.prototype的任何属性。

如果只需要数字索引,则 for 语句是正确的语句。。除非在某些狭窄的情况下,如T.J. Crowder在下面指出的那样。

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

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

通常你不应该将for-in用于数组 - 该结构更适合在对象上使用。使用传统的for循环:

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

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