是否有理由在条件中使用if ( object != null )
而不是更简洁if ( object )
。我更频繁地看到前者,但似乎两者相等而后者更短。
答案 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
的真实性。由于null
和undefined
都是假的,if (object)
“可用于确保object
不为空。
问题是,0
,false
和''
也虚假。当您使用if (object)
时,当object
为零,空字符串或实际布尔值false
时,您尝试在其为空时运行的代码也将被忽略。通常,这不是你想要的。
如果您不能保证object
为null或类型其他而不是字符串,数字或布尔值(或它们各自的对象类型),那么if (object != null)
不太可能意味着无意识的事情。