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 oneOrTheOther
auf dem Wert des ersten Ausdrucks nehmen , wenn es nicht null
, undefined
oder false
. In diesem Fall wird es dem Wert der zweiten Anweisung zugewiesen.
Wem wird die Variable oneOrTheOther
jedoch zugewiesen, wenn wir den logischen AND-Operator verwenden?
var oneOrTheOther = someOtherVar && "some string";
Was würde passieren, wenn someOtherVar
es nicht falsch ist?
Was würde passieren, wenn someOtherVar
es falsch ist?
Ich lerne nur JavaScript und bin gespannt, was mit der Zuweisung in Verbindung mit dem AND-Operator passieren würde.
Antworten:
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 ,
false
wenn sie in Booleschen Kontext verwendet, sind sienull
,undefined
,0
,NaN
, ein leerer String, und natürlichfalse
, irgendetwas anderes zu nötigttrue
.quelle
&&
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&&
wird manchmal als Wachoperator bezeichnet .Es kann nur verwendet werden, um den Wert einzustellen, wenn der Indikator wahr ist.
quelle
Zitat von Douglas Crockford 1 :
1 Douglas Crockford: JavaScript: Die guten Teile - Seite 16
quelle
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.
quelle
var x = y && y.z
?Gemäß Annotated ECMAScript 5.1 Abschnitt 11.11 :
Im Fall des logischen ODER-Operators (||),
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 (&&)
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".
quelle
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.
quelle