3

是否有任何理由使用if ( object != null )条件而不是更简洁的if ( object ). 我经常看到前者,但似乎两者是等价的,而后者更短。

4

3 回答 3

3

不同的对象被区别对待。有些值永远不能为空,并且在您不希望它时可能会错误地触发 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


Number 的行为类似于 int。如果一个 Number 已定义但未给定值,则将其视为 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)”是非常罕见的,因为大多数时候有一些更具体的东西是我真正关心的。

于 2012-10-16T18:29:11.850 回答
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方法返回包装器包含的任何值,在这种情况下)。问题是上面不仅测试了引用的可空性,它还隐式地调用了方法,由 Flash Player 虚拟机提供。当然,这种行为可能是也可能不是你想要的——你想测试它是否是空值还是它是否带有空值?(或者两者都可能)。falsemyWrappervalueOfmyWrapper

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

于 2012-10-16T18:20:47.670 回答
1

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

0但是,问题是 、false''也是假的当您使用if (object)时,当它为 null 时,您试图阻止运行的代码也将在object为零、空字符串或实际 boolean时被忽略false。通常,这不是你想要的。

如果您不能保证它object是 null 或字符串、数字或布尔值(或它们各自的对象类型)以外的类型,则不太if (object != null)可能意味着意外。

于 2012-10-16T18:07:06.153 回答