2

我用這個模式來測試在ActionScript/Flex的undefined和null值:測試在ActionsScript undefined和null子對象/ 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?

謝謝!

回答

3

你'得到這個錯誤是因爲obj的類型沒有它的子屬性。你需要做這樣的事情:

if((obj) && (obj.hasOwnProperty('child') && (obj.child)){ 
execute() 
} 

在Object類的hasOwnProperty方法更多信息: http://livedocs.adobe.com/flex/3/langref/Object.html#hasOwnProperty%28%29

+0

授予您找到測試屬性的Flex標準方法的答案。謝謝! – dbasch 2010-05-20 14:22:29

+0

感謝您的支持! – JeffryHouser 2010-05-20 15:32:01

+1

只是一個警告......這不會很* *是一樣的'obj.child':'obj.hasOwnProperty'將返回TRUE;如果'obj.child'是一個「假」值(例如,'null'或「0」)。 – 2010-05-20 15:45:17

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; 
} 
+0

有趣。我從來沒有想過要像這樣使用in運算符。謝謝! – dbasch 2010-05-20 14:22:59

0

可以使用數組符號避免引用錯誤:

if([obj.name][child.name]){ 
execute(); 
} 

的要認識到的重要一點是,避免錯誤可能會導致問題不堪重負 - 在大型應用程序中調試將變得更加困難。

當然,理想的方法是使用驗證功能,以確保你有合適的數據完全避免的情況,而不是測試空需要數據時。 :)

+0

您能舉一個使用驗證器來確保正確數據存在的例子嗎?謝謝! – dbasch 2010-05-20 14:21:01

+0

錯......這實際上是不正確的。 '['obj']'將返回一個包含一個元素的數組 - 而不是'obj'的本地實例。編輯代碼 – 2010-05-20 15:50:53

+0

!雖然我被否決了,我站在一個事實,即數組符號將通過避免引用錯誤修復OP的問題......通過驗證 ,我的意思是事情,比如所謂的「validateObj(OBJ:對象)函數返回一個布爾值。然後,而不是把邏輯'if(obj.child)',而是使用'if(validateObj(obj))'。 – Garrt 2010-05-21 00:46:32