Was ist der Unterschied zwischen & und && in JavaScript?

79

Was ist der Unterschied zwischen & und && in JavaScript?

Beispielcode:

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

Es scheint, als wäre && ein logisches "und", das mir immer den zweiten Wert gibt, wenn beide wahr sind.

Aber was ist &?

(Übrigens scheint && in Python "und" zu sein; & scheint in Python & zu sein.)

Martin Thoma
quelle

Antworten:

143

& ist bitweise UND

Dieser Operator erwartet zwei Zahlen und stimmt eine Zahl erneut ab. Falls es sich nicht um Zahlen handelt, werden sie in Zahlen umgewandelt.

Wie funktioniert es? Wikipedia hat eine Antwort: https://en.wikipedia.org/wiki/Bitwise_operation#AND

Hinweis: In Javascript wird von der Verwendung dieses Operators abgeraten, da es keinen ganzzahligen Datentyp gibt, sondern nur Gleitkommazahlen. Daher werden Floats vor jeder Operation in Ganzzahlen umgewandelt, was sie langsam macht. Außerdem hat es in typischen Webanwendungen keine wirkliche Verwendung und erzeugt unlesbaren Code.

Allgemeine Regel: Vermeiden. Benutze es nicht. Es hat selten Platz in einem wartbaren und lesbaren JS-Code.

&& ist logisch UND

Es erwartet zwei Argumente und gibt zurück:

  • Erster Begriff, der als falsch ausgewertet wird
  • Letzter Term anders (wenn alle wahr sind-y)

Hier sind einige Beispiele:

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)

Wenn Sie es immer nur auf Boolean verwenden, ist dies genau der AND-Operator aus der mathematischen Logik.

&& Verkettung des Bedieners

Der Grund, warum dieser Operator wie oben definiert ist, ist die Verkettung des Operators. Sie können diesen Operator verketten und trotzdem die oben genannten Regeln einhalten.

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

&& Kurzschluss

Wie aus der Definition hervorgeht, müssen Sie sich nicht um die folgenden Begriffe kümmern, sobald Sie feststellen, dass ein Begriff falsch ist. Javascript geht noch einen Schritt weiter, die Begriffe werden nicht einmal bewertet. Dies wird als Kurzschluss bezeichnet.

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

Diese Anweisung alarmiert nichts und falsewird zurückgegeben. Daher können Sie den &&Operator als kürzeren Ersatz für eine if-Anweisung verwenden. Diese sind gleichwertig:

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

Fast alle JS-Kompressoren verwenden diesen Trick, um 2 Bytes zu sparen.

Rok Kralj
quelle
4
&& gibt in JavaScript keinen Booleschen Wert zurück.
Sanghyun Lee
1
AFAIK &&gibt den ersten Wert zurück, wenn er false-y ist, und ansonsten den zweiten Wert.
Duri
1
Antwort komplett überarbeitet.
Rok Kralj
Wenn es den ersten Wert zurückgibt, verstehe ich nicht, wie ich das ausführen kann: if ($ ('# form1'). Parsley (). Validate () == true && $ ('# form2'). Parsley () .validate () == true) {// etwas tun, wenn beide Formulare gültig sind}, da es in der ersten Funktion beendet wird, wenn es falsch ist, und niemals das zweite Formular validiert. Wie wird dann diese IF-Anweisung ausgeführt?
user991
1
@ user777 Ist es nicht irrelevant, ob das zweite Formular validiert wird oder nicht, wenn Ihre Operation nur bei beiden Validierungen erfolgen soll? Wenn das erste Formular fehlschlägt, ist der gesamte Vorgang ungültig. Dies ist jedoch wirklich eine völlig separate Frage, da es in diesem Thread nur um die Rückgabe geht und nicht um die Verwendung von if-Anweisungen .
Ryan Williams
24

&ist das bitweise "und". Dies bedeutet, dass wenn Sie zwei Zahlen in Binärzahlen konvertiert haben, das Ergebnis eine Zahl ist, deren 1Ziffer an den Positionen steht, an denen beide Zahlen stehen 1.

  100011  //35
& 111001  //57
---------
  100001  //35 & 57 == 33
Duri
quelle
-2

Um festzustellen, ob zwei zusammengesetzte boolesche Werte wahr oder falsch sind, können Sie den &Operator verwenden , wenn Sie beide überprüfen möchten (z. B. Validierung auf der Webseite) . &ist bitweise UND.

Wenn der &&Bediener feststellt, dass der erste Wert falsch ist, wird die Auswertung beendet und der zweite Wert nicht überprüft.

Jake Wayne
quelle
1
Sie verwenden kein bitweises UND ( &), wenn Sie mit booleschen Werten arbeiten. Informationen zur angemessenen Verwendung dieses Operators finden Sie in den anderen Antworten.
FtDRbwLXw6
@drrcknlsn, ich habe die anderen Antworten gelesen, aber die Erklärung hier funktioniert sehr gut. Könnten Sie weitere Informationen zu Ihrem Anspruch bereitstellen?
Azerafati
1
@Bludream: Die Erklärung in dieser Antwort ist falsch. Sie verwenden keine bitweisen Operatoren für logische (boolesche) Vergleiche. Sie verwenden logische (boolesche) Operatoren. Sie machen unterschiedliche (wenn auch ähnliche) Dinge, erwarten unterschiedliche Eingaben, erzeugen unterschiedliche Ausgaben und haben unterschiedliche Operatorprioritäten.
FtDRbwLXw6
1
Ich würde zustimmen, dass es eine schlechte Praxis ist, aber die Verwendung von & mit booleschen Werten wird funktionieren. false wird mit 0 und true mit 1 bewertet. Ich sehe bei dieser Antwort nichts, was technisch falsch ist, da Sie & "verwenden" dürfen. Es wird einfach nicht empfohlen.
Dyoung
-2

Bei all den hohen, detaillierten Einsichten haben sie meistens die Wahrheit übersehen, dass es eine bedingte Bewertung gibt, bei der NUR die Single & funktionieren wird. Die Antwort des praktischen Laien, die meinen Kopfschlag auf einer IF-Anweisungszeichenfolge von MULTIPLE verkettet && jeder! == auf eine Bedingung löste, verursachte einen FEHLER und musste das einzelne & legitim verwenden. Ich danke Jake Wayne (und Russ) für ihre zu Unrecht herabgestimmte Antwort, die es richtig gemacht hat, da es mehr als eine && gibt! == es hat seine Bewertung bereits eingestellt und geht nicht weiter, nachdem die erste Bewertung gefunden wurde ==!. Mit dem && glaubt es, dass seine Arbeit erledigt ist, nachdem die erste Bewertung zeigt! == [z. falsch]. Mein fehlerhafter Code war

IF ((sessionStorage.myLable !== "LableStringA") && (sessionStorage.myLable !== "LableStringB") && (sessionStorage.myLableZ !== "LableStringA") && (sessionStorage.myLableZ !== "LableStringB")) { ...)

Hier war das richtige Ersetzen und Verwenden eines einzelnen & für das && sowohl praktisch in der realen Welt als auch technisch die richtige Antwort. Nochmals vielen Dank an Jake Wayne (und Russ) für den Einblick und das Verständnis von Code.

GladHeart
quelle
1
Ich empfehle nicht, etwas zu verwenden, nur weil es funktioniert, wenn Sie es nicht verstehen. Sie bereiten sich erst später auf Probleme vor, wenn diese nicht funktionieren und Sie sie nicht debuggen können. Oder noch schlimmer, Sie versuchen es in einem Vorstellungsgespräch zu verwenden und sie sehen Sie wie ಠ_ಠ an. Wenn Ihre Bedingungen nicht bewerten, wie Sie es erwarten, liegt ein logischer Fehler vor. Es gibt keinen Grund, alle 4 Bedingungen zu bewerten, wenn die erste falsch zurückgibt, da die kombinierte Bedingung in diesem Fall niemals als wahr bewertet werden kann
Brandon
Danke Brandon. Ich stelle Ihre allgemeinen Bedenken nicht in Frage. Ich halte mich immer an die === Konvention und führe sie ein. Hier waren jedoch ALLE vier Bewertungen entgegen Ihrem letzten gut gemeinten Kommentar notwendig. Alle vier Auswertungen mussten! == sein und wurden in diesem Format in der Klammer verwendet. Es war das verkettete &&, das sich nicht so erwartungsgemäß wie erwartet entwickeln würde. Die Verwendung eines einzelnen & wurde von den Compilern auf allen von mir getesteten Hauptbetriebssystemen korrekt gelesen.
GladHeart
Als Folge davon, warum es elegant zu funktionieren scheint und funktioniert, würde es in der Klarheit von Russ & Jakes falsch herabgesetzter Antwort liegen. Alle vier Bewertungen müssen bewertet werden. Die Verwendung von && stoppt / bricht ab, wenn die erste Auswertung falsch ist. Mit dem Single & können weiterhin die verbleibenden drei Bedingungen ausgewertet werden. Wie Russ & Jake sagte: "Wenn der Operator" && "feststellt, dass der erste Wert falsch ist, wird die Auswertung beendet und der zweite Wert nicht überprüft." Während "wenn Sie sie [alle] überprüfen möchten (wie die Validierung auf der Webseite), können Sie den Operator" & "verwenden." & "
Ist
1
Wenn Sie sie alle überprüfen müssen, können Sie Ihre Logik auch so strukturieren if (!(sessionStorage.myLable === "LableStringA" || sessionStorage.myLable === "LableStringB") || !(sessionStorage.myLableZ === "LableStringA" || sessionStorage.myLableZ === "LableStringB")) { // fail validation}, dass klarer zu sein scheint, was Sie beabsichtigen (ich gehe davon aus, dass Sie sicherstellen möchten, dass die Werte von myLable einer der beiden Werte sind, oder die Validierung fehlschlagen). . Sofern Ihre Erkrankungen keine Nebenwirkungen haben, gibt es keinen Grund, sie alle zu bewerten. Der Operator arbeitet wie beabsichtigt, aber Ihre Logik wurde umgedreht
Brandon
Ty für das Follow-up Brandon. In dieser Hinsicht fehlt immer noch die Notwendigkeit der Bedingungen in meinem Fall, unter denen das Suchen nach === eine von Dutzenden von Möglichkeiten für jede der vier Validierungen sein könnte. Wenn keiner von vier keinen bestimmten Seitenmarkierungswert enthält, greife ich einfach auf die Ausführung eines Skripts zurück, um dessen Fehlen zu kompensieren. Alle vier MÜSSEN alle als ==! Angezeigt werden. Es ist nicht so, dass "vorausgesetzt, Sie möchten sicherstellen, dass die Werte von myLable einer der beiden Werte sind", sondern dass myLable einer von vielen in einem Heuhaufen von Möglichkeiten ist. Daher ist Nichtäquivalenz eine einzige Frage, die 4x benötigt wird.
GladHeart