JavaScript检查数据超出界限

时间:2017-10-22 20:51:59

标签: javascript angularjs arrays reactjs ecmascript-6

我有一个矩阵作为竞技场,一个小矩阵作为播放器。使用密钥用户可以四处移动。 move(pos)接受论证和内部检查

if(pos=="down")
    if (!collide(pos)) player.pos.y++;

碰撞就像

一样
if(pos=="down")
    for (i = 0; i < player.matrix.length; i++)
    {
        for (j = 0; j < player.matrix[i].length; j++)
        {
            if ((player.matrix[i][j] && arena[player.pos.y + i + 1][player.pos.x + j]) != 0) result = true;
        }
    }

这个炒锅非常完美,直到你走到竞技场边缘。当你来到边缘时,因为没有lenght + 1 索引,如果检测得到Cannot read property of "" undefined。我试过首先检查typeof索引是否超出界限== undefined然而即使这给了我同样的错误。然后我尝试尝试捕获,但 catch 中的下一个函数卡在第一个和它自己之间。有什么想法可以找到一个简单的退出债券的解决方案吗?

1 个答案:

答案 0 :(得分:2)

我的建议只是通过长度比较保护arena[player.pos.y + i + 1][player.pos.x + j]来电:

for (i = 0; i < player.matrix.length; i++)
{
  for (j = 0; j < player.matrix[i].length; j++)
  { // here we have an additional protection of arena dimensions
    if(player.pos.y + i + 1 < arena.length && player.pos.x + j < arena[player.pos.y + i + 1].length)
    {
      if ((player.matrix[i][j] && arena[player.pos.y + i + 1][player.pos.x + j]) != 0)
        result = true;
    }
  }
}

您也可以在arena对象上实现其他方法:

arena.isValid = function(a, b) {
  // check for dimensions
  if(a >= arena.length || b >= arena[a].length) {
    return false;
  }
  // check if the value is undefined/null/0/false/""
  if(!arena[a][b]) {
    return false;
  }
  return true;
};

所以

for (i = 0; i < player.matrix.length; i++)
  for (j = 0; j < player.matrix[i].length; j++)
    if(player.matrix[i][j] && arena.isValid(player.pos.y + i + 1, player.pos.x + j))
      result = true;