1

如果我尝试进入不存在的数组索引,有什么方法可以防止 javascript 出错?

示例:array[-1]将返回错误并最终破坏我的所有代码。我怎样才能让它只返回“未定义”并让我的脚本继续执行?我可以在检查数组之前实现一个 if 语句(这样,如果索引小于零或大于数组大小,它将跳过它)但这将非常乏味!

这是我的代码:

if (grid[j-1][i])
n++;
if (grid[j+1][i])
n++;
if (grid[j][i+1])
n++;
if (grid[j][i-1])
n++;
if (grid[j-1][i-1])
n++;
if (grid[j+1][i+1])
n++;
if (grid[j-1][i+1])
n++;
if (grid[j+1][i-1])
n++;

它在两个循环中,两个循环都看到 J 和 I 从零开始。我不想更改它们,也不想写另一个 if 语句(如您所见,它们已经太多了!)。有什么解决办法吗?

谢谢!

4

6 回答 6

1

如果您知道网格的度量,则可以在其周围放置“哨兵单元”。

如果将 -1st 索引添加到数组x中,则不计入x.length. 将额外的最后一个元素放入列表中会增加x.length.

我敢说使用前哨细胞结合 d_inevitable 提到的算术计数算法将是最快的解决方案,因为它不会涉及分支。您甚至可以省略!!因为将在均衡中true计算为 1 和0。false

更新:

不要使用索引 -1。它比普通数组索引慢得多。请参阅http://jsperf.com/index-1

于 2012-04-22T01:59:16.613 回答
1

您可以使用||,它可以消除错误,例如:

(grid[j-1] || [])[i] || false

(我还没有测试过,但它应该可以工作)

编辑:根据我不是我的建议更新

于 2012-04-22T01:33:00.667 回答
0

仍然使用 ifs 的一种不那么乏味的方法是检查第一个索引是否已定义:

if (typeof grid[j-1] != "undefined" && grid[j-1][i])
于 2012-04-22T01:36:32.317 回答
0

您可以创建一个函数来进行检查:

function getArrayValue(arr,key) {
    if( key < 0 || key >= arr.length) return null;
    return arr[key];
}

但实际上你应该避免越界键。

于 2012-04-22T01:38:39.167 回答
0

这对你的解决方案怎么样?

for (dj = -1; dj <= 1; ++dj) {
  for (di = -1; di <= 1; ++di) {
    if ((dj || di) && grid[j+dj] && grid[j+dj][i+di]) {
        n++;
    }
  }
}   

如果您将所有这些ifs 重构为像上面这样的单个循环,那么必须执行额外的条件并不是那么糟糕。

于 2012-04-22T01:45:05.847 回答
0

我会这样做:

for(m = Math.max(j-1,0) ; m <= Math.min(j+1,grid.length-1) ; m++)
  for (p = Math.max(i-1,0) ; p <= Math.min(i+1, grid[m].length-1) ; p++)
     n += !(m == j && p == i) && !!grid[m][p];
于 2012-04-22T01:48:31.623 回答