检查2D数组索引是否存在

4

我有一个名为positions的8x8二维数组,我想知道如何检查索引是否已定义。我看到了一个使用的示例。

if (typeof positions[8] === "undefined") alert('undefined');

但是当我尝试使用行和列的索引时,代码如下:

if (typeof positions[8][0] === "undefined") alert('undefined');

我在遇到错误:
Uncaught TypeError: Cannot read property '0' of undefined

有没有一种方法可以检查一个二维数组的索引是否存在,不仅对于一个索引而言,而是对于两个维度的索引都要检查?


为什么你不检查两个? - Hacketo
你能举个例子吗?我不太明白你在说什么,谢谢。 - MarksCode
如果 ((typeof positions[8] === "undefined") || (typeof positions[8][0] === "undefined")) 则弹出警告('undefined'); - Gio
如果(Array.isArray(positions [8])&& typeof positions [8] [0] ===“undefined”)则使用typeof进行检查 - Hacketo
那么,在你的例子中,'&&' 后面的第二部分和我尝试的有什么区别呢? - MarksCode
2个回答

3
问题在于该行不存在,因此您无法访问其中的元素。
解决方案为:
if ((positions[8]||[])[0] === undefined) { ... }

理念是undefined是假的,因此如果第8行不存在,则position[8] || []将返回一个空列表,并且第二个索引不会引发错误。
这个表达式的问题在于,如果确实存在position[8]undefined,那么将分配一个新的临时空行来尝试访问它。虽然这可能在某些实现中可以通过聪明的编译器解决,但另一种避免使用这种临时分配的选择是:
if (!position[8] || position[8][0] === undefined) { ... }

问题在于结果中的position[8]都被查找了两次(如果position是全局变量,这可能需要进行字典查找,更糟糕的是,访问position[8]可能会改变下一次查找中position的解析结果,如果position是代理,则会出现此情况)。

甚至更明确的是:

{
  let row = position[8];
  if (row === undefined || row[0] === undefined) { ... }
}

据我所知,AFAIK应该能够解决这些问题,但是它更冗长且难以阅读,并且在大多数情况下可能不是一个好主意。

顺便说一句:鉴于Javascript的普遍方向只返回undefined并保持运行,确实令人惊讶的是undefined[...]没有被定义为undefined本身而引发了错误。

另外,访问一个潜在不存在的数组元素、对象潜在不存在的字段或调用潜在不存在的函数的问题正变得越来越普遍,可能在几个月内会有(或者已经有)提案添加类似position[?8]===undefined的东西,以表示这种类型的常见计算。但据我所知,这还没有成为Javascript的一部分(尚未)。


你的解释真的很有道理,谢谢!我看到其他人将其与字符串“undefined”进行比较,而你只是将其与undefined进行比较,这是一样的吗? - MarksCode
@MarksCode:他们将 typeof 的结果与字符串 "undefined" 进行比较(typeof 操作符返回一个字符串)。我更喜欢使用严格相等 === 来与 undefined 进行比较,而不是使用 typeof - 6502

0

你需要检查两个数组中是否存在元素,但这种方法更简短:

if (!(8 in positions && 0 in positions[8])) alert('undefined');

查看更多关于in运算符的信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接