2011-11-04 76 views
21

我有一个需要3个参数的函数,我遇到的问题是其中一个参数是Object的一个有时未定义的值的属性(即,它需要在?thing.foo.bar,有时thing.foo是不确定的,所以它不能访问酒吧Javascript“can not read property”bar“undefined

有什么解决的办法在函数的声明,我有一个条件检查: if (!parameterName),但浏览器(Chrome)仍然抛出一个错误,说它无法读取酒吧属性undefined。

谢谢!

+1

我想我有点理解,但不是真的......你可以发布你的代码吗? –

回答

32

如果一个对象的属性可以参考一些其他的对象,那么你可以尝试使用其属性之前测试未定义我的回答更好地反映了你的情况,如果你显示一些实际的代码,但可能是这样的:

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

@Mörre:这工作得很好。 OP明确指出'thing.foo'是未定义的,所以它需要声明。 – Cerbrus

6

复方检查:

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

我可以更新:

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

这是一个语法错误..它应该是'thing.foo && thing.foo.bar' – Reid

+0

谢谢。固定..深夜。 –

2

在你传递给你的函数之前请检查它。所以,你会传递:

thing.foo ? thing.foo.bar : undefined 
7

可以维护自己的任一方法有两种:

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语句执行速度更快。在可能有许多可能的情况需要防范并且代码结构化的复杂情况下,异常可以更简单地进行编码和使用,以便引发异常并处理它是在某些数据不存在时跳过执行的干净方式。抛出异常时,异常会慢一点。