2012-10-16 89 views

回答

2

下面的代碼將有一個對象計算爲false,即使對象不爲空:

class SomeWrapper 
{ 
    var value: Object; 

    SomeWrapper(Object value) 
    { 
     this.value = value; 
    } 

    /// Overriden method from Object, see ActionScript 3 reference 
    function valueOf() 
    { 
     return value; 
    } 
} 

var myWrapper = new SomeWrapper(false); 

if(myWrapper) 
{ 
    trace("myWrapper evaluates to true."); 
} 
else 
{ 
    trace("myWrapper evaluates to false."); 
} 

else塊將在上面的例子中執行,因爲myWrapper計算結果爲false(其valueOf方法返回無論封裝器包含什麼值,在這種情況下爲false),即使myWrapper不是空引用。問題是,上面確實不僅僅是測試的可參考性,它隱含地調用了valueOf方法,由Flash Player虛擬機提供。當然,這種行爲可能是也可能不是你想要的 - 你想測試myWrapper是否爲空值或是否攜帶空值? (或者兩者都有)。

在這種情況下的詳細程度是你的朋友,否則你獲得代碼可讀性以迴應潛在的運行時錯誤。

+0

感謝您的迴應,特別是'valueOf'的分析和示例。我還會在0和''中添加特別的評論以及其他對這個傑出貢獻的答案。 –

+0

@StevenXu,不客氣。我不確定你想添加什麼,但如果你詳細說明,我可以編輯它。我認爲其他答案也涵蓋了我的答案沒有的東西。 – amn

1

if (expression)通過獲取其布爾值來檢驗expression的真實性。由於nullundefined都是虛假的,因此if (object)「有效」以確保object不爲空。

問題是,雖然,0false,和'' falsy。在使用if (object)時,如果object爲零,一個空字符串或實際布爾值爲false,那麼當它試圖保持空運行的代碼也將被忽略。通常情況下,這不是你想要的。

如果你不能保證object是null或類型其他不是字符串,數字或布爾值(或各自的對象類型),然後if (object != null)不太可能意味着什麼意外。

2

不同的對象被區別對待。有些值永遠不會爲空,並且在您不需要時可能會錯誤地觸發false。


布爾值永遠不能爲空。 如果定義了布爾值但未給定值,則將其視爲false;

var bool:Boolean; 
trace(bool); // false 
bool = true; 
trace(bool); // true 


INT不能爲空爲好。 如果定義了一個int但沒有給出一個值,則將其視爲0;

var i:int; 
trace(i); // 0 
trace(Boolean(i)); // false 
i = -1; 
trace(Boolean(i)); // true 
i = 0; 
trace(Boolean(i)); // false 
i = 1; 
trace(Boolean(i)); // true 


數起類似的詮釋。 如果數量被定義但不是給定的值時,它被處理爲NaN的

var num:Number; 
trace(num); // NaN 
trace(Boolean(num)); // false 
num = -1.1; 
trace(Boolean(num)); // true 
num = 0; 
trace(Boolean(num)); // false 
num = 1.1; 
trace(Boolean(num)); // true 


字符串是最差的。 如果定義了字符串但沒有給定值,則將其視爲空值!

var str:String; 
trace(str); // null 
trace(Boolean(str)); // false 
str = "" 
trace(Boolean(str)); // false 
str = "hello"; 
trace(Boolean(str)); // true 

這是在我的代碼非常罕見的,我只是做「如果(OBJ)」,因爲大多數的時候有更具體的,我真正關心的東西。

+0

感謝您指出0和''的情況! –

相關問題