Javascript中奇怪的行为增强了for ... in循环

我正在用画布标签制作一款Javascript游戏,并且我正在使用增强版for循环来更新玩家位置。

简单来说:

var actors = new Array();

var player = new Actor(0, 0, img);

actors[0] = player;

function update_positions() {
    //position 1
    for(var a in actors) {
        //position2
        a.xpos += a.xvel;
        a.ypos += a.yvel;
    }
}

就在位置1的for循环之外,我可以访问actors [0] .xvel的正确值。 在位置2的for循环中,a.xvel未定义。 有人可以向我解释发生了什么事吗?


for...in语句旨在用于遍历对象属性,通过查看您的代码看起来actors是一个Array(您正在设置索引为0的初始元素)。

这条语句也会抓取原型链,如果你扩展了Array.prototype那些属性将被迭代,并且迭代次序也不被保证。

我会建议你避免出现问题,并重复使用正常的for循环:

for (var i = 0; i < actors.length; i++) {
    actors[i].xpos += actor.xvel;
    actors[i].ypos += actor.yvel;
}

如果我错了, actors不是数组,我建议你使用hasOwnProperty方法,以确保该属性存在于对象本身中,而不是在原型链中的某处:

for (var name in object) {
  if (object.hasOwnProperty(name)) {
    //
  }
}

它看起来像你试图访问名称上的对象属性,而不是这里的值。 索引(在本例中为“0”)在for / in循环中被赋值为'a'。

你想要做的就是访问数组成员的值,即:actors [a]。

尝试这个:

for(var a in actors) { // a=0 the first time around the loop,  
    actor = actors[a]; // same thing as actors[0];
    actor.xpos += actor.xvel;
    actor.ypos += actor.yvel;
}

for (x in y)构造体遍历数组的索引,而不是其成员。

链接地址: http://www.djcxy.com/p/4199.html

上一篇: Strange behavior in Javascript enhanced for...in loop

下一篇: What's the fastest way to loop through an array in JavaScript?