代码之家  ›  专栏  ›  技术社区  ›  naugtur

对于迭代,元素未定义

  •  3
  • naugtur  · 技术社区  · 15 年前

    我有这个代码:

    for(var i in this.units)
     {
     if(this.units[i].x==att.x && this.units[i].y==att.y){}
     //... some more code
     }
    

    有时,随机地,我会得到一个错误,单位[i]是未定义的。

    有人知道怎么可能吗?

    5 回复  |  直到 15 年前
        1
  •  1
  •   Andy E    15 年前

    尖刻地在他的回答中简要地提到了这个问题的可能原因,那就是 this.units[i] 可能为空。如果您尝试访问一个空值的属性,您将得到一个“is null or not an object”错误。在您的示例中,这是由于尝试访问 this.units[i].x 在if语句中。最安全的做法是先检查它是否为空值:

    for(var i in this.units) 
    { 
        if (this.units[i] === null)
            continue;
    
        if(this.units[i].x==att.x && this.units[i].y==att.y){} 
        //... some more code 
    }
    

    你还应该看看他的回答中的其他要点,最重要的是 for...in 循环不适用于数组。

        2
  •  2
  •   Pointy    15 年前

    循环符号

    for (var i in this.units)
    

    提供在“Units”对象中定义的属性。其中一些可能没有值,例如,如果在某个地方做了一些事情:

    this.units.balloon = null;
    

    使用“in”循环迭代对象属性是非常危险的,除非 真正地 知道你的物品是怎么回事。如果您的对象实际上是一个数组,那么您肯定不想这样做——您应该使用数字索引和带有数字变量的纯循环。(即使这样,也可能有空条目!)

        3
  •  1
  •   Andriy Drozdyuk Pickels    15 年前

    我的错:我以为这个问题是在蟒蛇身上!

    你可能在做如下的事情:

    del this.units[i]
    

    在代码中的某个地方,或者以某种方式更改集合。在迭代过程中这是一个不允许的。

        4
  •  1
  •   Ruan Mendes    15 年前

    首先,如果您的迭代是在一个对象上进行的,不要使用“i”作为迭代变量,使用prop或key来明确说明您是在迭代属性,而不是索引。

    第二,听起来您可以简单地调试并找出对象中的哪些元素是空的。如果没有完整的代码,很难帮助您。我想问题是你在删除

    obj.myProp = null;
    

    这意味着for-in循环仍将迭代该属性。但是,如果您使用

    delete obj.myProp;
    

    MyProp不会在for-in循环中迭代。

        5
  •  0
  •   brettkelly    15 年前
    for(var i = 0; i < this.units.length; i++){
        if(this.units[i].x==att.x && this.units[i].y==att.y){}
    }
    

    你正在尝试索引 this.units 使用来自的元素 本.单位 . 使用for循环(如上所示)。