Javascript AND-Operator in Zuordnung
-
02-10-2019 - |
Frage
Ich weiß, dass in JavaScript können Sie tun:
var oneOrTheOther = someOtherVar || "these are not the droids you are looking for...";
, wo der Variable oneOrTheOther
auf dem Wert des ersten Ausdrucks nehmen, wenn es nicht null
, undefined
ist, oder false
. In diesem Fall ist es wird auf den Wert der zweiten Anweisung zugeordnet.
Was aber der Variable oneOrTheOther
zu zugewiesen bekommen, wenn wir den logischen UND-Operator?
var oneOrTheOther = someOtherVar && "some string";
Was würde passieren, wenn someOtherVar
nicht falsch ist?
Was würde passieren, wenn someOtherVar
falsch ist?
Just JavaScript lernen, und ich bin neugierig, was mit Zuordnung in Verbindung mit dem AND-Operator geschehen würde.
Lösung
Grundsätzlich ist die logische UND-Operator (&&
), wird der Wert des zweiten Operanden zurück, wenn die erste Seite ist truthy , und es wird der Wert des ersten Operanden zurück, wenn es von selbst < em> falsy , zum Beispiel:
true && "foo"; // "foo"
NaN && "anything"; // NaN
0 && "anything"; // 0
Beachten Sie, dass falsy Werte sind diejenigen, die coerce zu false
wenn in Booleschen Kontext verwendet, sie sind null
, undefined
, 0
, NaN
, eine leere Zeichenfolge, und natürlich false
, alles andere nötigt zu true
.
Andere Tipps
ist &&
manchmal ein Wächter Operator.
variable = indicator && value
kann es verwendet werden, um den Wert zu setzen, nur wenn der Indikator truthy ist.
Der
&&
Operator erzeugt den Wert seines ersten Operanden, wenn der erste Operand falsy ist. Andernfalls wird der Wert des zweiten Operanden erzeugt.
1 Douglas Crockford: JavaScript: The Good Parts - Seite 16
Beginners Beispiel
Wenn Sie den Zugriff auf „user.name“ versuchen, aber dann geschieht dies:
Uncaught TypeError: Cannot read property 'name' of undefined
Fürchte dich nicht. Sie können dies die && Operator in einer Zuweisung mit lösen oder oft die guard Operator , da sie "Wächter" aus dem undefinierten Fehler passiert genannt.
Hier sind einige Beispiele, die Sie ungerade finden können, aber lesen Sie weiter, wie es später erläutert 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
Erklärung : In der Wache Betrieb wird jeder Begriff ausgewertet wird links nach rechts eine nach der anderen . Wenn beurteilt ein Wert falsy ist, Auswertung beendet und dieser Wert wird dann zugewiesen. Wenn der letzte Punkt erreicht ist, wird es dann zugewiesen, ob es falsy ist.
falsy bedeutet, es ist einer dieser Werte undefined, false, 0, null, NaN, ''
und truthy bedeutet nur, NICHT falsy.
Einfache Taste für Schutz Methode
Mit lodash schönen guard Bediener Zugriff verschachtelter Daten wie folgt:
// need to access obj.has.some.very.nested.stuff
var val = _.get(obj, 'has.some.very.nested.stuff');
, wie es behandelt die && Sachen unter der Haube, während schön zu Verwendung in einem geeigneten Verfahren zu sein. Lodash _.get Quellcode
Bonus: Der OR Operator
Die andere nützliche seltsame Zuordnung, die in der praktischen Anwendung ist der OR-Operator , die typischerweise für Plugins wie so verwendet wird:
this.myWidget = this.myWidget || (function() {
// define widget
})();
, die nur den Codeabschnitt zuweist, wenn „this.myWidget“ falsy ist. Das ist praktisch, weil Sie Code an beliebiger Stelle und mehrfach nicht darum kümmern erklären kann, wenn sein oder nicht zuvor zugewiesen wurde, zu wissen, es wird nur einmal vergeben werden, da die Menschen ein Plugin verwenden könnte Ihr Skript-Tag src mehrere Male versehentlich erklären.
Erklärung : Jeder Wert wird ausgewertet von von links nach rechts, einen nach dem anderen . Wenn ein Wert truthy ist, stoppt Auswertung und Abtretungsempfänger dieser Wert, andernfalls läuft weiter, wenn der letzte Punkt erreicht ist, wird es zugeordnet unabhängig davon, ob es falsy ist oder nicht.
Extra Credit: Die Kombination von && und || in einer Zuordnung
Sie haben nun die ultimative Macht und kann tun, sehr seltsame Dinge wie diese sehr seltsam Beispiel in einem Palindrom verwendet wird.
function palindrome(s,i) {
return (i >= s.length/2) || (s[i] === s[s.length -1 - i]) && palindrome(s, ++i);
}
In ausführliche Erläuterung hier: Palindrome in Javascript überprüfen
Happy-Codierung.
Nach Kommentieren ECMAScript 5.1 Abschnitt 11.11 :
Im Fall des logischen OR-Operator (||),
ausdr1 || expr2 Returns expr1, wenn es in true umgewandelt werden kann; andernfalls kehrt expr2. Wenn also mit Boolesche Werte verwendet, || true zurück, wenn einer der Operanden wahr ist; wenn beide falsch sind, kehrt false.
In dem gegebenen Beispiel
var oneOrTheOther = someOtherVar || „Das sind nicht die Droiden Sie suchen ... bewegen sich entlang“;
Das Ergebnis der Wert von someOtherVar wäre, wenn Boolean (someOtherVar) wahr . (Bitte beachten. Iness eines Ausdrucks ). Wenn es falsch ist, wäre das Ergebnis „das sind nicht die Droiden Sie suchen ... bewegen sich entlang“;
Und Im Fall des logischen AND-Operator (&&)
Returns expr1, wenn es auf false umgewandelt werden kann; andernfalls kehrt expr2. Wenn also mit Boolesche Werte verwendet, && gibt true zurück, wenn beide Operanden wahr sind; andernfalls wird false zurückgegeben.
In dem gegebenen Beispiel
Fall 1: Wenn Boolean (someOtherVar) falsch ist. Es gibt den Wert someOtherVar
Fall 2: wenn Boolean (someOtherVar) wahr. Es gibt „diese sind nicht die Droiden Sie suchen ... bewegen sich entlang“
Ich habe gesehen worden && überstrapaziert hier bei der Arbeit für die Zuweisungsanweisungen. Die Sorge ist zweifach: 1) Die ‚Anzeige‘ Check ist manchmal eine Funktion mit Overhead, dass die Entwickler berücksichtigen nicht. 2) Es ist leicht für Devs nur um es zu sehen, wie eine Sicherheitsprüfung und nicht betrachtet sie als falsch ihre var zuweisen. Ich mag sie eine typsichere Einstellung haben, so dass ich sie diese haben ändern:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex();
folgt aus:
var currentIndex = App.instance && App.instance.rightSideView.getFocusItemIndex() || 0;
, so dass sie eine ganze Zahl erhalten, wie erwartet.