2012-10-16 29 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和''的情况! –

相关问题