web-dev-qa-db-ja.com

JavaScriptの&と&&の違いは何ですか?

JavaScriptの&と&&の違いは何ですか?

サンプルコード:

var first  = 123;
var second = false;
var third  = 456;
var fourth = "abc";
var fifth  = true;
alert(first & second); // 0
alert(first & third);  // 72
alert(first & fourth); // 0
alert(first & fifth);  // 1

alert(first && second); // false
alert(first && third);  // 456
alert(first && fourth); // abc
alert(first && fifth);  // true

&&は論理的な「and」のようで、両方が真の場合は常に2番目の値が与えられます。

しかし、&とは何ですか?

(ちなみに、&&はPythonでは "and"であるようです;&はPythonで&であるようです。)

62
Martin Thoma

&はビット単位AND

この演算子は、2つの数字を期待し、数字を戻します。数字ではなく、数字にキャストされます。

どのように機能しますか?ウィキペディアには答えがあります: https://en.wikipedia.org/wiki/Bitwise_operation#AND

注:Javascriptでは、この演算子の使用法はdiscouraged、整数データ型はなく、浮動小数点のみです。したがって、フロートはすべての操作の前に整数に変換されるため、処理が遅くなります。また、典型的なWebアプリケーションでは実際には使用されず、読み取り不能なコードを生成します。

一般規則:避けてください。使用しないでください。保守可能で読みやすいJSコードにはめったに配置されません。

&&は論理AND

2つの引数を予期し、以下を返します。

  • 偽と評価される最初の用語
  • それ以外の最後の用語(すべてがtrue-yの場合)

ここではいくつかの例を示します。

0 && false          0 (both are false-y, but 0 is the first)
true && false       false (second one is false-y)
true && true        true (both are true-y)
true && 20          20 (both are true-y)

ブール値でのみ使用する場合、これは数学ロジックのAND演算子です。

&&演算子チェーン

この演算子が上記のように定義されている理由は、演算子の連鎖です。この演算子をチェーンしても、上記のルールを維持できます。

true && 20 && 0 && 100          0 (it is the first false-y)
10 && 20 && true && 100         100 (last one, since all are true-y)

&&短絡

定義からわかるように、1つの用語がfalse-yであることがわかるとすぐに、次の用語を気にする必要はありません。 Javascriptはこれをさらに一歩進め、用語は評価されません。これは短絡と呼ばれます。

true && false && alert("I am quiet!")

このステートメントは何も警告せず、falseが返されます。したがって、ifステートメントの短い置換として&&演算子を使用できます。これらは同等です:

if (user.isLoggedIn()) alert("Hello!")
user.isLoggedIn() && alert("Hello!")

ほとんどすべてのJSコンプレッサーは、このトリックを使用して2バイトを節約します。

114
Rok Kralj

&はビット単位の「and」です。これは、2つの数値を2進数に変換した場合、結果は両方の数値が1を持つ位置に1数字を持つ数値になることを意味します。

  100011  //35
& 111001  //57
---------
  100001  //35 & 57 == 33
21
duri

すべての高尚で詳細な洞察により、4つの連鎖&&のIFステートメント文字列で頭を打つことを解決した実用的な素人の答えは、IF((sessionStorage.myLable!== "LableStringA" )&&(sessionStorage.myLable!== "LableStringB")&&(sessionStorage.myLableZ!== "LableStringA")&&(sessionStorage.myLableZ!== "LableStringB")){...)は実際に解決されました単純に&&の代わりに単一の&を使用することにより、-4の採決されたソリューション(今すぐ下に表示)で、Jake Wayne(およびRuss)に感謝します。私の例のテストでは、優先される!==の代わりに使用した場合、!=も機能します。

0
GladHeart