我正在使用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;
}
}
在位置1的for循环之外,我可以访问actors [0] .xvel的正确值。在位置2的for循环内,a.xvel未定义。有人可以向我解释发生了什么吗?
答案 0 :(得分:86)
for...in
语句用于迭代对象属性,通过查看代码似乎actors
是一个数组(您正在设置初始元素index 0
)。
这个语句也将crawl up原型链,如果你扩展了Array.prototype
那些属性将被迭代,并且迭代的顺序也是不合理的。
我建议你避免problems并使用普通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)) {
//
}
}
答案 1 :(得分:4)
看起来您正在尝试访问名称上的对象属性,而不是此处的值。索引(在本例中为'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;
}
答案 2 :(得分:2)
尝试使用actors[a].xpos
而非a.xpos
。
有关JavaScript for-in loops的更多信息,请参阅此处。
答案 3 :(得分:2)
for (x in y)
构造遍历数组的索引,而不是其成员。
答案 4 :(得分:0)
另一种选择是使用underscore库:
_.each( actors, function(a) {
a.xpos += a.xvel;
a.ypos += a.yvel;
});
或者如果您不想使用下划线但仍然使用JQuery,那么您可以这样做:
$.each( actors, function(i, a) {
a.xpos += a.xvel;
a.ypos += a.yvel;
});
这种迭代功能模式的一个很好的特性是你可以使用var
来声明循环中的变量,这些变量的范围是循环体,这有助于避免被奇怪的变量范围规则所困扰。的JavaScript。