我有一个需要 3 个参数的函数。我遇到的问题是其中一个参数是对象的有时未定义值的属性(即它接受thing.foo.bar,有时thing.foo未定义,因此它无法访问bar)。
有什么办法解决这个问题?在函数的声明中,我有一个条件检查:
if (!parameterName)
,但浏览器(Chrome)仍然抛出一个错误,它无法读取undefined的bar属性。
我有一个需要 3 个参数的函数。我遇到的问题是其中一个参数是对象的有时未定义值的属性(即它接受thing.foo.bar,有时thing.foo未定义,因此它无法访问bar)。
有什么办法解决这个问题?在函数的声明中,我有一个条件检查:
if (!parameterName)
,但浏览器(Chrome)仍然抛出一个错误,它无法读取undefined的bar属性。
如果一个对象的属性可能引用某个其他对象,那么您可以在尝试使用其属性之前测试它是否为 undefined:
if (thing && thing.foo)
alert(thing.foo.bar);
如果您显示一些实际代码,我可以更新我的答案以更好地反映您的情况,但可能是这样的:
function someFunc(parameterName) {
if (parameterName && parameterName.foo)
alert(parameterName.foo.bar);
}
复合检查:
if (thing.foo && thing.foo.bar) {
... thing.foor.bar exists;
}
您可以通过以下两种方式保护自己:
function myFunc(thing) {
if (thing && thing.foo && thing.foo.bar) {
// safe to use thing.foo.bar here
}
}
function myFunc(thing) {
try {
var x = thing.foo.bar;
// do something with x
} catch(e) {
// do whatever you want when thing.foo.bar didn't work
}
}
在第一个示例中,您在使用之前明确检查您引用的变量的所有可能元素以确保它是安全的,这样您就不会遇到任何计划外的引用异常。
在第二个示例中,您只需在其周围放置一个异常处理程序。您只需thing.foo.bar
假设它存在即可访问。如果确实存在,则代码正常运行。如果它不存在,那么它将抛出一个异常,您将捕获并忽略该异常。最终结果是一样的。如果thing.foo.bar
存在,您使用它的代码就会执行。如果它不存在,则代码不会执行。在所有情况下,函数运行正常。
该if
声明是更快地执行。在复杂的情况下,异常可以更简单地编码和使用,在这种情况下,可能有许多可能的事情需要保护,并且您的代码结构化,以便在某些数据不存在时抛出异常并处理它是一种跳过执行的干净方法. 抛出异常时异常会慢一点。
只需在传递给函数之前检查它。所以你会通过:
thing.foo ? thing.foo.bar : undefined