3

ライブラリに、オブジェクト参照(ここでのオブジェクトとは、作成されたHTML要素(主にDIV)への参照)の有効性をチェックする単純な関数があります。次のようになります。

function varIsValidRef(aRef) {
    return ( !(aRef == null || aRef == undefined) && typeof(aRef) == "object");
}

実験している間、私はこれが同じ効果を持っていることを発見しました:

function varIsValidRef(aRef) {
    return (aRef) && typeof(aRef) == "object";
}

速記()テストに関していくつかの論争があることを理解していますか?さまざまなデータ型(null、undefined、integer、float、string、array)に対してテストしている間、最終的な結果に違いは見つかりませんでした。この機能は期待どおりに機能しているようです。

これらの2つのバージョンはまったく同じことをしていると言っても安全ですか?

4

4 に答える 4

1

いいえ、私の意見では、これらの関数は同じようには機能しません。

最初のオプション
が そうaRefでない場合、undefinedまたはnull変数のタイプがそうである場合は、objecttrueを返します。

2番目のオプション
最初にaRefブール値に変換します。のような値nullundefinedおよび0になるfalse、他のすべては。になりtrueます。そうである場合true(したがって、これらの値の1つではない場合)、タイプがオブジェクトであるかどうかをチェックします。

したがって、2番目のオプションはfalseを返します。これaRef0、望ましくないことです。また、オブジェクトや文字列などがブール値に等しいかどうかをチェックするため、エレガントなチェック方法ではありません。

そして、少なくとも彼らは同じものを返しません。最初のオプションはブール値を返しますが、2番目のオプション(aRef)はfalseの場合に関数に入力した値を返します。

varIsValidRef(0);
>>> 0

varIsValidRef('');
>>> ""

varIsValidRef(undefined);
>>> undefined

varIsValidref(null);
>>> null

JavaScriptはこれらの値を偽の値として使用するため、ifステートメントなどを使用しても、これらの戻り値の違いはわかりません。

したがって、最初のオプションを使用することをお勧めします。

于 2012-04-29T16:11:06.443 に答える
1

それらは大きく異なります:

!(aRef == null || aRef == undefined)

この部分は、これらのいずれかでfalseと評価されます"null", null, "undefined", undefined

(aRef)

これらのいずれかでこの他の0, "", false, null, undefined, NaN

于 2012-04-29T16:28:07.083 に答える
0

それらは同じ結果にはなりませんが、同じことはしません。

最初の関数は、一緒にfalseとしてカウントされるもの、またはそうでない場合はオブジェクトとしてカウントされるものについて、より厳密です。

2番目の関数は、偽の値(つまり、、、)のいずれかであるかどうaRefかをチェックし、オブジェクトでない場合はタイプがオブジェクトであるかどうかをチェックします。!false[]nullundefined

最初の関数は、受け入れるものがより厳密であるため、私は最初の関数を好みますが、それがすべて同じである場合は、最高のパフォーマンスを発揮する関数を使用する必要があります。

論争に関しては、方程式で偽の値を使用する方法/時期に注意する必要があるのは事実ですが、それがあなたが望むことを行う場合(そしてそのためには偽の値が何であるかを知る必要があります)そしてあなたは正しく実装すれば問題ありません。しかし、この2つを組み合わせるのは困難です。それで、これがあなたがしたいことをし、多かれ少なかれ何もしないなら、どうしてもそれを使ってください。

于 2012-04-29T16:10:09.777 に答える
0

興味深いケースですが、まったく異なるにもかかわらず、両方が同じように動作することは論理的であるように思われます。最初のステーメントを見てみましょう。

return ( !(aRef == null || aRef == undefined) && typeof(aRef) == "object");

ここ、

nullundefined両方ともinfrontと組み合わされた状態falseを示し、両方がnullでも未定義でもない場合に返される!式と等しくなります。aReftrue

于 2012-04-29T16:11:44.380 に答える