3

if ( object != null )より簡潔なものではなく、条件付きで使用する理由はありますかif ( object )?前者の方がよく見かけますが、両者は同等で後者は短いようです。

4

3 に答える 3

3

オブジェクトが異なれば、扱いも異なります。nullになることはなく、望まないときに誤ってfalseをトリガーする可能性のある値がいくつかあります。


ブール値を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


文字列は最悪です。文字列が定義されているが値が指定されていない場合、それは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、オブジェクトが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ブロックは上記の例で実行されます。これは、null参照ではない場合でも、myWrapper評価されるためfalse(そのvalueOfメソッドはラッパーに含まれる値を返します。この場合false) 。myWrapper問題は、上記が参照のnull可能性をテストするだけでなくvalueOf、FlashPlayer仮想マシンのおかげで暗黙的にメソッドを呼び出すことです。もちろん、この動作は希望どおりである場合とそうでない場合がmyWrapperあります。null値であるかどうか、またはnull値を持っているかどうかをテストしますか?(または両方)。

この場合の冗長性は友だちです。そうでない場合は、潜在的なランタイムエラーと引き換えにコードの可読性が向上します。

于 2012-10-16T18:20:47.670 に答える
1

if (expression)expressionブール値を取得することにより、の真実性をテストします。nullundefinedはどちらも偽物であるため、nullでないif (object)ことを確認するための「動作」object

問題は、しかし0、、、falseそしてまた偽物です。を使用すると、nullの場合に実行を阻止しようとしているコードは、がゼロ、空の文字列、または実際のブール値の場合にも無視されます。多くの場合、それはあなたが望むものではありません。''if (object)objectfalse

objectnull、または文字列、数値、ブール値以外の型(またはそれぞれのオブジェクト型)のいずれかを保証できない場合は意図しif (object != null)ないものを意味する可能性は低くなります。

于 2012-10-16T18:07:06.153 に答える