如果我尝试进入不存在的数组索引,有什么方法可以防止javascript丢失错误?
示例:array[-1]
会返回错误并最终破坏我的所有代码。我怎么能让它只返回'undefined'并让我的脚本继续?我可以在检查数组之前实现一个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语句(你可以看到,它们已经有太多了!)。有没有解决方案?
谢谢!
答案 0 :(得分:1)
您可以使用||
来消除错误,例如:
(grid[j-1] || [])[i] || false
(我没有测试过这个,但它应该有用)
编辑:更新基于我不是我的建议
答案 1 :(得分:1)
如果您知道网格的尺寸,可以在其周围放置“哨兵细胞”。
如果向数组x
添加第-1个索引,则不会计入x.length
。将额外的最后一个元素添加到列表中会增加x.length
。
我敢说使用哨兵细胞结合d_inevitable提到的算术计数算法将是最快的解决方案,因为它不涉及分支。您甚至可以省略!!
,因为true
将在均衡中评估为1,false
评估为0.
不要使用索引-1。它比正常的数组索引慢得多。请参阅http://jsperf.com/index-1。
答案 2 :(得分:0)
在使用ifs时,一种不那么繁琐的方法是检查第一个索引是否已定义:
if (typeof grid[j-1] != "undefined" && grid[j-1][i])
答案 3 :(得分:0)
您可以创建一个功能来进行检查:
function getArrayValue(arr,key) {
if( key < 0 || key >= arr.length) return null;
return arr[key];
}
但实际上你应该避免使用越界键。
答案 4 :(得分: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++;
}
}
}
如果你将所有if
重构为如上所述的单个循环,那么必须做额外的条件并不是那么糟糕。
答案 5 :(得分: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];