是否有任何理由使用if ( object != null )
条件而不是更简洁的if ( object )
. 我经常看到前者,但似乎两者是等价的,而后者更短。
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)”是非常罕见的,因为大多数时候有一些更具体的东西是我真正关心的。
以下代码将有一个对象评估为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 虚拟机提供。当然,这种行为可能是也可能不是你想要的——你想测试它是否是空值还是它是否带有空值?(或者两者都可能)。false
myWrapper
valueOf
myWrapper
在这种情况下,冗长是您的朋友,否则您将获得代码可读性以换取潜在的运行时错误。
if (expression)
expression
通过获取其布尔值来测试其真实性。由于null
和undefined
都是虚假的,因此if (object)
“有效”确保object
不为空。
0
但是,问题是 、false
和''
也是假的。当您使用if (object)
时,当它为 null 时,您试图阻止运行的代码也将在object
为零、空字符串或实际 boolean时被忽略false
。通常,这不是你想要的。
如果您不能保证它object
是 null 或字符串、数字或布尔值(或它们各自的对象类型)以外的类型,则不太if (object != null)
可能意味着意外。