我正在测试我的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提供了处理此问题的方法的链接。
答案 0 :(得分:1)
typeof
运算符,或者===
(或==
)运算符,可以应用于任何表达式的结果。因此,obj['item']
或obj.item
这样的表达式会引发错误,如果obj
是无法索引的任何类型的对象,例如undefined或null。
同样,如果obj['item']['color']
求值为无法索引的值,则obj['item']
等表达式将引发错误。
在typeof foo
或foo === undefined
等表达式中,foo
部分会在typeof
或===
部分之前进行评估。如果foo
是obj['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.");
}
简而言之:这是正常的。每个步骤按顺序发生,并且当任何步骤引发异常时执行停止。