if子句用于未定义的对象需要在外部数组上进行测试

时间:2015-07-21 13:25:01

标签: javascript

我正在测试我的ajax代码并注意到我只能在外部数组上执行if-defined-clause。

对我来说,如果我必须检查所有外部阵列,这似乎有点多余。想象一下,有10个子阵列。 任何人都可以确认这是否正常,或者可能通过更好的方法来检查某个对象是否未定义?我从Stackoverflow获取的代码(部分类型)。

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

if (typeof obj['item']['color'] == 'undefined') {    
//this does not work
} else {
//proceed
}

注意:显然这是正常的(答案是“是”)感谢Epascarello提供了处理此问题的方法的链接。

1 个答案:

答案 0 :(得分:1)

  • typeof运算符,或者===(或==)运算符,可以应用于任何表达式的结果。
  • 任何表达式的评估都可能引发错误。

因此,obj['item']obj.item这样的表达式会引发错误,如果obj是无法索引的任何类型的对象,例如undefined或null。

同样,如果obj['item']['color']求值为无法索引的值,则obj['item']等表达式将引发错误。

typeof foofoo === undefined等表达式中,foo部分会在typeof===部分之前进行评估。如果fooobj['item']['color']

obj['item']['color'] === undefined

首先将obj评估为一个值。然后obj['item']被评估。然后评估obj['item']['color']。 (同样undefined被评估)然后可以评估===运算符。如果这些步骤中的任何一个引发错误,则抛出错误。

如果你真的不知道你正在使用的数据,并且你真的不想抛出任何错误,那么你的代码最终会像:

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.");
    }

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