web-dev-qa-db-ja.com

JavaScriptでdoublenot(!!)演算子を使用する場合

私は理解しています JavaScriptでdouble not演算子が行うこと 。私はそれが使用されていること、そして私が最近行った主張が正しいかどうかについて興味があります。

if (!!someVar)は決して意味がなく、_(!!someVar && ..._も意味がないと言いました。これは、ifと_&&_の両方がsomeVarをブール値として評価するためです。余計です。

実際、double not演算子を使用することが正当であると私が考えることができるのは、別のブール値と厳密に比較したい場合だけです(したがって、trueまたはfalseを明示的に期待する戻り値である可能性があります)。

これは正しいです? jQuery1.3.2がif (!!someVar)と_return !!someVar && ..._の両方を使用していることに気付いたとき、私は自分自身を疑うようになりました。

これらの状況では、ダブルは実際の効果はありませんか?

私の個人的な意見は、それは混乱につながるだけだということです。 ifステートメントが表示された場合、それがブール値として評価されていることがわかります。

31
Keith Bentrup

ifステートメント のコンテキストでは、私はあなたと一緒です。内部的には、ToBoolean操作が条件式で実行されるため、完全に安全です(仕様のステップ3を参照)。

ただし、たとえば、関数からブール値を返したい場合は、結果が実際にブール値になるようにする必要があります。次に例を示します。

function isFoo () {
  return 0 && true;
}

console.log(isFoo()); // will show zero
typeof isFoo() == "number";

結論として、 ブール論理演算子はオペランドを返すことができますが、必ずしもBooleanの結果ではありません。

論理AND演算子(&&)、最初のオペランドがtrulyの場合、2番目のオペランドの値を返します。

true && "foo"; // "foo"

そして、それ自体の場合は第1オペランドの値を返します

NaN && "anything"; // NaN
0 && "anything"; // 0

一方、論理OR演算子(||)は、最初のオペランドがfalsyの場合、2番目のオペランドの値を返します。

false || "bar"; // "bar"

そして、それ自体が偽物でない場合は、第1オペランドの値を返します。

"foo" || "anything"; // "foo"

falsyの値は次のとおりです:nullundefinedNaN0、長さゼロの文字列、そしてもちろんfalse

boolean context)で評価されたその他のもの(falsyBooleanオブジェクトまたはBoolean値ではないtrueを返します。

39
CMS

はい、!! varは0 || 1の戻り値が必要な場合に使用されます。

1つは、ブール値の単純な比較です。「a == b」を「axornot b」と同等にしたい場合は、a = 5とb = 7の両方が真であるが、等しくないことを除きます。

もう1つは、条件のセットを変数のビットに強制変換する場合です。

 var BIT_NONEMPTY=1;
 var BIT_HASERRORS=2;
 var BIT_HASCHILDREN=4;
 var BIT_HASCONTENT=8;

 result_bitfields = 
    (!!countLines())*BIT_NOTEMPTY +
    (!!errorCode())*BIT_HASERRORS +
    (!!firstChild())*BIT_HASCHILDREN +
    (!!getContent())*BIT_HASCONTENT;

ビット値からかなり離れた場所にあるJavascriptではあまり役に立ちませんが、時々役立つ場合があります。

0
SF.