我使用此模式在ActionScript / Flex中测试未定义和空值:
if(obj) {
execute()
}
不幸的是,当我使用模式测试子对象时,总会引发ReferenceError:
if(obj.child) {
execute()
}
ReferenceError: Error #1069: Property child not found on obj and there is no default value.
为什么使用if语句测试子对象会引发ReferenceError?
谢谢!
答案 0 :(得分:3)
您收到此错误,因为obj的类型中没有子属性。你需要做这样的事情:
if((obj) && (obj.hasOwnProperty('child') && (obj.child)){
execute()
}
有关Object类中hasOwnProperty方法的更多信息: http://livedocs.adobe.com/flex/3/langref/Object.html#hasOwnProperty%28%29
答案 1 :(得分:2)
当obj
是强类型对象但没有child
字段时会发生这种情况。
您可以使用in
运算符测试任何对象上是否存在字段:
if ("foo" in obj && obj.foo)
execute();
我还编写了一个实用程序函数来简化这个过程:
function getattr(obj:Object, field:*, dflt:*=undefined):* {
if (field in obj && obj[field])
return obj[field];
return dflt;
}
答案 2 :(得分:0)
您可以使用数组表示法来避免引用错误:
if([obj.name][child.name]){
execute();
}
要意识到的重要一点是,简单地避免错误可能会导致问题失败 - 在大型应用程序中调试会更加困难。
当然,理想的方法是通过使用验证器函数来确保您拥有正确的数据,而不是在需要数据时测试null,从而完全避免这种情况。 :)