Javascript If语句为不存在的对象引发错误
这个问题的答案似乎是显而易见的,但我一直在寻求改进我的语义,所以请容忍我 我有一个包含X,Y坐标的数组结构Javascript If语句为不存在的对象引发错误,javascript,object,if-statement,Javascript,Object,If Statement,这个问题的答案似乎是显而易见的,但我一直在寻求改进我的语义,所以请容忍我 我有一个包含X,Y坐标的数组结构 var example = new Array(); example.push({x:0,y:0}); 在我的代码中,我设置了一个更新画布和检查特定条件的时间间隔。包括一个类似的 if(example[0].x == other.x && example[0].y == other.y) { //do something } 问题是数组是非常动态的,当第一次执行代码时,
var example = new Array();
example.push({x:0,y:0});
在我的代码中,我设置了一个更新画布和检查特定条件的时间间隔。包括一个类似的
if(example[0].x == other.x && example[0].y == other.y)
{
//do something
}
问题是数组是非常动态的,当第一次执行代码时,示例数组是空的。因此,Chrome会抛出“无法获取属性x”的错误。为了关闭控制台,我向数组{x:“~”,y:“~”}添加了一个伪项,但它看起来确实不直观。我是否实现了不需要的数据结构?处理以下对象的if语句的简单方法是什么。。。不存在?为什么不检查数组是否有元素
if (example.length && ...)
或者第一个元素是否为真:
if (example[0] && ...)
为什么不检查数组是否有元素
if (example.length && ...)
或者第一个元素是否为真:
if (example[0] && ...)
(这适用于任意索引,而不仅仅是0
;如果您只想检查数组是否为非空,示例。如melpomene所示,长度
很好。)
(这适用于任意索引,而不仅仅是
0
;如果您只想检查数组是否为非空,example.length
,如melpomene所示很好。)您应该能够检查第一级元素(即“example”)-当您试图访问null或未定义元素的属性时,JavaScript通常会抛出类似这样的错误。正如其他一些人已经表明的那样:
if(example[0] && example[0].x === other.x)
关键是JavaScript会让您拥有示例[0]并按自己的喜好返回,但一旦您尝试访问该属性,您就不走运了:
var example = [];
//undefined
example
//[]
example[0]
//undefined <--- this is a falsy value, will evaluate false in a check
example[0].x
//TypeError: Cannot read property 'x' of undefined
var示例=[];
//未定义
例子
//[]
示例[0]
//undefined您应该能够检查第一级元素(即“example”)-当您试图访问null或未定义元素的属性时,JavaScript通常会抛出类似这样的错误。正如其他一些人已经表明的那样:
if(example[0] && example[0].x === other.x)
关键是JavaScript会让您拥有示例[0]并按自己的喜好返回,但一旦您尝试访问该属性,您就不走运了:
var example = [];
//undefined
example
//[]
example[0]
//undefined <--- this is a falsy value, will evaluate false in a check
example[0].x
//TypeError: Cannot read property 'x' of undefined
var示例=[];
//未定义
例子
//[]
示例[0]
//未定义的示例[0]
将因[undefined]
,[null]
,[0]
,[false]
而失败。。。只有当您毫无疑问地知道虚假值不存在时才使用。对于[未定义]
和[空]
,它应该失败undefined.x
和null.x
也会抛出异常(和0.x
/false.x
都是不明智的做法);我没有投反对票或其他任何东西,只是说它在这种情况下有效,但在另一种情况下推广和应用相同的策略是不明智的。(我知道至少有一次当我认为我不应该做的事情时,它咬了我的懒屁股。)@amadan在这种情况下没关系,因为成员应该是对象。但是很好地指出了这些限制。示例[0]
将失败于[undefined]
,[null]
,[0]
,[false]
。。。只有当您毫无疑问地知道虚假值不存在时才使用。对于[未定义]
和[空]
,它应该失败undefined.x
和null.x
也会抛出异常(和0.x
/false.x
都是不明智的做法);我没有投反对票或其他任何东西,只是说它在这种情况下有效,但在另一种情况下推广和应用相同的策略是不明智的。(我知道至少有一次当我认为我不应该做的事情时,它咬了我的懒屁股。)@amadan在这种情况下没关系,因为成员应该是对象。但很好地指出了局限性。