Javascript UND Operator innerhalb der Zuordnung

71

Ich weiß, dass Sie in JavaScript Folgendes tun können:

var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";

wobei die Variablen oneOrTheOtherauf dem Wert des ersten Ausdrucks nehmen , wenn es nicht null, undefinedoder false. In diesem Fall wird es dem Wert der zweiten Anweisung zugewiesen.

Wem wird die Variable oneOrTheOtherjedoch zugewiesen, wenn wir den logischen AND-Operator verwenden?

var oneOrTheOther = someOtherVar && "some string";

Was würde passieren, wenn someOtherVares nicht falsch ist?
Was würde passieren, wenn someOtherVares falsch ist?

Ich lerne nur JavaScript und bin gespannt, was mit der Zuweisung in Verbindung mit dem AND-Operator passieren würde.

Alex
quelle
2
Versuch es. jsfiddle.net/uv6LR
icktoofay
1
siehe meine Antwort von einem verwandten Beitrag .. stackoverflow.com/questions/3088098/…
Anurag
Wenn in Ihrem Beispiel someOtherVar undefiniert ist, wird ein Fehler ausgegeben. Wenn Sie window.someOtherVar verwenden, kann es den zweiten Wert annehmen, wenn someOtherVar nicht definiert ist.
Rich

Antworten:

90

Grundsätzlich gibt der logische AND-Operator ( &&) den Wert des zweiten Operanden zurück, wenn der erste wahr ist , und er gibt den Wert des ersten Operanden zurück, wenn er selbst falsch ist , zum Beispiel:

true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything";   // 0

Beachten Sie, dass falsy Werte sind diejenigen , die coerce zu , falsewenn sie in Booleschen Kontext verwendet, sind sie null, undefined, 0, NaN, ein leerer String, und natürlich false, irgendetwas anderes zu nötigt true.

Christian C. Salvadó
quelle
Ah ok. Vielen Dank. Das macht Sinn, denn es ist immerhin die Umkehrung des OR-Operators.
Alex
Bei Verwendung mit Booleschen Werten gibt && also true zurück, wenn beide Operanden true sind. Andernfalls wird false zurückgegeben. ( developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )
Bardelman
Ich liebe das Beispiel. Es wäre großartig, wenn Sie ein wenig darüber &&sagen würden, wie man einen "Guard" -Operator nennt, der für Nullprüfungen gut ist, da dies ein guter Kontext ist. Sie können sogar Douglas Crockford hier zitieren: javascript.crockford.com/survey.html
Akrikos
30

&&wird manchmal als Wachoperator bezeichnet .

variable = indicator && value

Es kann nur verwendet werden, um den Wert einzustellen, wenn der Indikator wahr ist.

Mykhal
quelle
2
Wirklich klare Antwort. Die anderen Antworten haben mich ziemlich verblüfft, aber dies ist eine sehr klare Art, es auszudrücken. Vielen Dank!
ctaymor
Ich denke, diese Antwort ist eindeutig falsch. Nachdem die obige Anweisung ausgeführt wurde, ist der Wert von 'Variable' der Wert des Ausdrucks "Indikator && Wert", was auch immer das sein mag. Der Wert der Variablen auf der linken Seite der Zuweisung wird also immer auf etwas gesetzt. unabhängig davon, was auf der rechten Seite passiert (es sei denn, es wird ein Fehler ausgegeben). Nein?
Panu Logic
18

Zitat von Douglas Crockford 1 :

Der &&Operator erzeugt den Wert seines ersten Operanden, wenn der erste Operand falsch ist. Andernfalls wird der Wert des zweiten Operanden erzeugt.


1 Douglas Crockford: JavaScript: Die guten Teile - Seite 16

Daniel Vassallo
quelle
Crockford nennt es hier auch den "
Wachoperator
17

Anfänger Beispiel

Wenn Sie versuchen, auf "user.name" zuzugreifen, geschieht dies jedoch:

Uncaught TypeError: Cannot read property 'name' of undefined 

Keine Angst. Sie können dies mit dem Operator && in einer Zuweisung lösen oder häufig als Guard-Operator bezeichnen da er vor dem undefinierten Fehler "schützt".

Hier sind einige Beispiele, die Sie vielleicht seltsam finden, aber lesen Sie weiter, wie es später erklärt wird.

var user = undefined;
var username = user && user.username;
// no error, "username" assigned value of "user" which is undefined

user = { username: 'Johnny' };
username = user && user.username;
// no error, "username" assigned 'Johnny'

user = { };
username = user && user.username;
// no error, "username" assigned value of "username" which is undefined

Erläuterung : Bei der Schutzoperation wird jeder Begriff einzeln von links nach rechts ausgewertet . Wenn ein ausgewerteter Wert falsch ist, wird die Auswertung gestoppt und dieser Wert wird dann zugewiesen. Wenn das letzte Element erreicht ist, wird ihm zugewiesen, ob es falsch ist oder nicht.

Falschheit bedeutet, dass es sich um einen dieser Werte handelt, undefined, false, 0, null, NaN, ''und Wahrhaftigkeit bedeutet einfach NICHT Falschheit.

Einfache Taste für die Schutzmethode

Verwenden Sie den schönen Guard-Operator von lodash, um auf verschachtelte Daten wie folgt zuzugreifen:

// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');

wie es das && Zeug unter der Haube behandelt, während es in einer bequemen Methode nett zu verwenden ist. Lodash _.get Quellcode

Bonus: Der OP-Operator

Die andere nützliche seltsame Aufgabe, die in der Praxis verwendet wird, ist die OR-Operator, der normalerweise für Plugins wie folgt verwendet wird:

this.myWidget = this.myWidget || (function() {
   // define widget
})();

Dadurch wird der Codeteil nur zugewiesen, wenn "this.myWidget" falsch ist. Dies ist praktisch, da Sie Code überall und mehrmals deklarieren können, ohne sich darum zu kümmern, ob er zugewiesen wurde oder nicht, da Sie wissen, dass er nur einmal zugewiesen wird, da Benutzer eines Plugins Ihr Skript-Tag src möglicherweise versehentlich mehrmals deklarieren.

Erläuterung : Jeder Wert wird einzeln von links nach rechts ausgewertet . Wenn ein Wert wahr ist, stoppt er die Auswertung und weist diesen Wert zu. Andernfalls wird er fortgesetzt. Wenn das letzte Element erreicht ist, wird er zugewiesen, unabhängig davon, ob er falsch ist oder nicht.

Extra Credit: Kombinieren von && und || in einer Aufgabe

Sie haben jetzt die ultimative Kraft und können sehr seltsame Dinge tun, wie dieses sehr seltsame Beispiel für die Verwendung in einem Palindrom.

function palindrome(s,i) {
 return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}

Ausführliche Erklärung hier: Palindrom-Check in Javascript

Viel Spaß beim Codieren.

Jason Sebring
quelle
Danke, tolles Beispiel! Hilf mir sehr, && und || zu verstehen Betreiber! +1
Glücklicher
Vielen Dank für diese Antwort! Ich bin gespannt, wie lange JS noch versuchen wird, auf die Eigenschaft mit der tiefsten Ebene zuzugreifen. Wenn Sie beispielsweise auf eine Antwort in Ihrem Backend gewartet haben, ist die Verwendung sicher var x = y && y.z ?
Scott Savarie
2

Gemäß Annotated ECMAScript 5.1 Abschnitt 11.11 :

Im Fall des logischen ODER-Operators (||),

Ausdruck1 || expr2 Gibt expr1 zurück, wenn es in true konvertiert werden kann. Andernfalls wird expr2 zurückgegeben. Bei Verwendung mit Booleschen Werten ist || also Gibt true zurück, wenn einer der Operanden true ist. Wenn beide falsch sind, wird false zurückgegeben.

Im gegebenen Beispiel ist

var oneOrTheOther = someOtherVar || "das sind nicht die Droiden, die du suchst ... mach weiter";

Das Ergebnis wäre der Wert von someOtherVar, wenn Boolean (someOtherVar) wahr ist (siehe Wahrheit eines Ausdrucks ). Wenn es falsch ist, wäre das Ergebnis "das sind nicht die Droiden, die Sie suchen ... gehen Sie weiter";

Und im Fall des logischen UND-Operators (&&)

Gibt expr1 zurück, wenn es in false konvertiert werden kann. Andernfalls wird expr2 zurückgegeben. Bei Verwendung mit Booleschen Werten gibt && also true zurück, wenn beide Operanden true sind. Andernfalls wird false zurückgegeben.

Im gegebenen Beispiel ist

Fall 1: Wenn Boolean (someOtherVar) false ist, wird der Wert von someOtherVar zurückgegeben.

Fall 2: Wenn Boolean (someOtherVar) wahr ist, wird zurückgegeben: "Dies sind nicht die Droiden, nach denen Sie suchen ... gehen Sie weiter".

BatScream
quelle
0

Ich habe gesehen, dass && hier bei der Arbeit für Zuweisungserklärungen überbeansprucht wurde. Es gibt zwei Probleme: 1) Die Überprüfung des Indikators ist manchmal eine Funktion mit Overhead, die Entwickler nicht berücksichtigen. 2) Für Entwickler ist es einfach, dies nur als Sicherheitsüberprüfung zu betrachten und nicht zu berücksichtigen, dass sie ihrer Variable falsch zuweisen. Ich mag es, wenn sie eine typsichere Einstellung haben, also lassen sie das ändern:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();

dazu:

var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;

Sie erhalten also wie erwartet eine Ganzzahl.

Drew Deal
quelle