JavaScript“无法读取未定义的属性”栏

JavaScript “cannot read property ”bar" of undefined

本问题已经有最佳答案,请猛点这里访问。

我有一个函数需要3个参数。我的问题是其中一个参数是对象的一个有时未定义值的属性(即它接受thing.foo.bar,有时thing.foo未定义,因此它无法访问bar)。

怎么解决这个问题?在函数的声明中,我有一个条件检查:if (!parameterName),但是浏览器(chrome)仍在抛出一个错误,它无法读取undefined的bar属性。


如果对象的属性可能引用其他对象,则可以在尝试使用其属性之前测试该对象是否未定义:

1
2
if (thing && thing.foo)
   alert(thing.foo.bar);

如果您显示一些实际的代码,我可以更新我的答案以更好地反映您的情况,但可能类似这样:

1
2
3
4
function someFunc(parameterName) {
   if (parameterName && parameterName.foo)
       alert(parameterName.foo.bar);
}


您可以通过以下两种方式保护自己:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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语句的执行速度更快。异常对于代码和在复杂情况下使用更简单,在这种情况下,可能有许多事情需要保护,并且您的代码是结构化的,因此当某些数据不存在时,抛出异常并处理异常是跳过执行的一种干净方法。当抛出异常时,异常会慢一些。


复合检查:

1
2
3
   if (thing.foo && thing.foo.bar) {
      ... thing.foor.bar exists;
   }


在传递到您的函数之前检查一下它。所以你可以通过:

1
thing.foo ? thing.foo.bar : undefined