Javascript 未定义对象的if子句要求对外部数组进行测试

Javascript 未定义对象的if子句要求对外部数组进行测试,javascript,Javascript,在测试ajax代码时,我注意到我只能在外部数组上执行if-defined子句 对我来说,如果我必须检查所有外部阵列,这似乎有点多余。假设有10个子阵列有人能确认这是否正常吗,或者告诉我一种更好的方法来检查对象是否未定义?我从Stackoverflow获取的代码(部件类型) if (typeof obj['item'] == 'undefined') { //this works } else { //proceed } if (typeof obj['item']['color'] =

在测试ajax代码时,我注意到我只能在外部数组上执行if-defined子句

对我来说,如果我必须检查所有外部阵列,这似乎有点多余。假设有10个子阵列有人能确认这是否正常吗,或者告诉我一种更好的方法来检查对象是否未定义?我从Stackoverflow获取的代码(部件类型)

if (typeof obj['item'] == 'undefined') {    
//this works
} else {
//proceed
}

if (typeof obj['item']['color'] == 'undefined') {    
//this does not work
} else {
//proceed
}
注意:显然这是正常的(答案是“是”),感谢Epasarello提供了解决方法的链接。

  • typeof
    运算符或
    ==
    (或
    =
    )运算符可应用于任何表达式的结果
  • 任何表达式的求值都可能引发错误
因此,如果
obj['item']
obj.item
是无法索引的任何类型的对象,例如未定义或null,则表达式(如
obj['item']]
obj.item
将引发错误

同样,如果
obj['item']['color']
的计算结果为无法索引的值,则诸如
obj['item'][/code>之类的表达式将引发错误

在诸如
typeof foo
foo===undefined
之类的表达式中,
foo
部分在
typeof
===
部分之前求值。因此,如果
foo
obj['item']['color']

obj['item']['color'] === undefined
首先将obj
计算为一个值。然后计算对象['item']。然后对obj['item']['color']进行评估。(同时
未定义
被求值)然后可以求值
=
运算符。如果这些步骤中的任何一个抛出错误,那么就会抛出错误

如果您确实不知道正在处理的数据,并且确实不希望抛出任何错误,那么您的代码最终将看起来像:

if (obj !== undefined && obj !== null && obj.item !== undefined && obj.item !== null && obj.item.color !== undefined)
    {
    console.log("Hello World!");
    }
else
    {
    console.log("Sorry, I can't help you.");
    }

简言之:这是正常的。每个步骤按顺序进行,当任何步骤引发异常时,执行停止。

或任何其他搜索结果什么不起作用
obj['item']['color']
可以是未定义的,但是当然如果
obj['item']
是未定义的,那么你就不能对其应用
['color']
操作,该操作将发生在
=
@espascarello之前
@espascarello哇,该代码看起来像是外来语言:)谢谢链接@dsh,基本问题有更多的细微差别,而不是不起作用…,我将重新措辞。非常感谢您的解释,很抱歉反应太晚。