JavaScript抛出了一个与拼接相关的异常-敌人[i]未定义

JavaScript抛出了一个与拼接相关的异常-敌人[i]未定义,javascript,Javascript,所以,我有这个函数,出于某种原因,它在某个点开始抛出一个“敌人[I]是未定义的”错误。该函数在游戏循环中不断被调用 function moveEnemies() { for(i = 0; i < enemies.length; i++) { enemies[i].y += FE_SPEED; enemies[i].c.attr("y", friends[i].y); if(enemies[i].y > 640) delete enemies[

所以,我有这个函数,出于某种原因,它在某个点开始抛出一个“敌人[I]是未定义的”错误。该函数在游戏循环中不断被调用

function moveEnemies() {

  for(i = 0; i < enemies.length; i++) {
    enemies[i].y += FE_SPEED;
    enemies[i].c.attr("y", friends[i].y);
    if(enemies[i].y > 640)
      delete enemies[i];
  }

  for(i = 0; i < enemies.length; i++) {
    if(!enemies[i])
      enemies.splice(i, 1);
  }
}
函数(){
对于(i=0;i<0.length;i++){
敌人[i].y+=FE_速度;
敌人[i].c.attr(“y”,朋友[i].y);
if(敌人[i].y>640)
删除敌人[i];
}
对于(i=0;i<0.length;i++){
如果(!敌人[i])
3.拼接(i,1);
}
}

我做错了什么?

您正在更改for循环中的数组

1.拼接(i,1)正在更改敌人的长度

e、 g


敌人.length
是一个不断变化的值,因为您调用了
删除敌人[i]
敌人.splice(i,1)
。相反,您应该不断更改一个变量,该变量会更新列表的长度,并在循环计数器高于此变量时中断循环。@stackErr:No它不会从
delete
调用中更改。当然,他根本不应该使用
delete
,但那是另一回事了。@Bergi oops是的
delete
不会改变它,但是
splice
会改变它!我不确定这是不是一个完全相同的副本。副本没有提到删除,问题也不是同一个问题。答案可能相似,但问题似乎很独特。
var a = [1,2,3,4];
a.splice(1,2);

console.log( a.length ); // 2