JavaScript";无法读取属性";酒吧;未定义的

JavaScript";无法读取属性";酒吧;未定义的,javascript,undefined,Javascript,Undefined,我有一个函数,它有3个参数。我遇到的问题是,其中一个参数是对象的一个有时未定义值的属性(即,它接受thing.foo.bar,有时thing.foo未定义,因此无法访问bar) 这有什么办法?在函数的声明中,我有一个条件检查: 如果(!parameterName),但浏览器(Chrome)仍抛出错误,无法读取未定义的条属性。复合检查: if (thing.foo && thing.foo.bar) { ... thing.foor.bar exists;

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

这有什么办法?在函数的声明中,我有一个条件检查:
如果(!parameterName)
,但浏览器(Chrome)仍抛出错误,无法读取未定义的条属性。

复合检查:

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

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

if (thing && thing.foo)
   alert(thing.foo.bar);
如果您显示一些实际的代码,我可以更新我的答案以更好地反映您的情况,但可能类似于以下内容:

function someFunc(parameterName) {
   if (parameterName && parameterName.foo)
       alert(parameterName.foo.bar);
}

在你进入你的功能之前检查一下。所以你会通过:

thing.foo ? thing.foo.bar : undefined

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

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
语句执行速度更快。在复杂的情况下,编写和使用异常可能更简单,因为可能有许多可能的事情需要保护,并且您的代码是结构化的,因此在某些数据不存在时,抛出异常并对其进行处理是一种跳过执行的干净方法。抛出异常时,异常会稍微慢一点。

@Mörre:这很好。OP明确声明“代码>事物。FoO 未定义,因此必须声明。可以考虑“可选链接”EX:<代码> Too.Fo..Bar < /代码>。