我有一个名为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
有没有办法检查2D数组的索引是否存在,不仅对于一个索引而且对于它的两个维度?
答案 0 :(得分: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应该解决这些问题但是更加冗长和难以阅读,在大多数情况下可能是个坏主意。
PS:鉴于Javascript的一般方向只是返回undefined
并继续运行,确实令人惊讶,undefined[...]
并未被定义为undefined
本身提出错误。
PPS:访问潜在不存在的数组中的元素,潜在不存在的对象中的字段或调用可能不存在的函数的这个问题正变得越来越流行,并且可能会在几个月内(或者已经有一个关于添加像position[?8]===undefined
这样的东西的提议,正好意味着这种有点常见的计算。但据我所知,这还没有成为Javascript(还)。
答案 1 :(得分:0)
您必须检查两个数组是否存在元素,但这种方法更短:
if (!(8 in positions && 0 in positions[8])) alert('undefined');
Check有关in
运算符的更多信息。