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

Spe*_*cer 32 javascript foreach for-loop

我正在使用canvas标签制作一个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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

CMS*_*CMS 87

for...in语句用于迭代对象属性,通过查看代码似乎actors是一个数组(您使用索引设置初始元素0).

此语句还将爬行原型链,如果已扩展,Array.prototype那些属性将被迭代,并且也不保证迭代的顺序.

我建议你避免问题,并使用正常的for循环迭代:

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

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

for (var name in object) {
  if (object.hasOwnProperty(name)) {
    //
  }
}
Run Code Online (Sandbox Code Playgroud)