if(object!= null)而不是AS3中的if(object)

时间:2012-10-16 17:46:19

标签: actionscript-3

是否有理由在条件中使用if ( object != null )而不是更简洁if ( object )。我更频繁地看到前者,但似乎两者相等而后者更短。

3 个答案:

答案 0 :(得分:3)

不同的对象被区别对待。有一些值永远不会为null,并且当您不希望它时可能会错误地触发错误。


布尔人永远不会是空的。 如果定义了布尔值但未给出值,则将其视为false;

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


int也永远不会为null。 如果定义了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


数字行为类似于int。 如果定义了数字但未给出值,则将其视为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


字符串是最糟糕的。 如果定义了String但没有给出值,则将其视为null!

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

在我的代码中我很少见'if(obj)'因为大部分时间都有一些我真正关心的更具体的东西。

答案 1 :(得分:2)

以下代码的对象评估为false,即使该对象不为null:

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方法返回包装器包含的任何值,在本例中为{{ 1}})即使false不是空引用。问题是,上面的不仅测试引用的可空性,它隐式调用myWrapper方法,由Flash Player虚拟机提供。当然的这种行为可能是您想要的也可能不是 - 您想测试valueOf是否为空值或者是否带有空值? (或两者都可能)。

在这种情况下,详细程度是您的朋友,否则您将获得代码可读性以换取潜在的运行时错误。

答案 2 :(得分:1)

if (expression)通过获取其布尔值来测试expression的真实性。由于nullundefined都是假的,if (object)“可用于确保object不为空。

问题是,0false'' 虚假。当您使用if (object)时,当object为零,空字符串或实际布尔值false时,您尝试在其为空时运行的代码也将被忽略。通常,这不是你想要的。

如果您不能保证object为null或类型其他而不是字符串,数字或布尔值(或它们各自的对象类型),那么if (object != null)不太可能意味着无意识的事情。