Angesichts dieses Ausschnitts von JavaScript ...
var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';
var f = a || b || c || d || e;
alert(f); // 4
Kann mir bitte jemand erklären, wie diese Technik heißt (meine beste Vermutung steht im Titel dieser Frage!)? Und wie / warum funktioniert es genau?
Nach meinem Verständnis wird der Variablen f
der nächste Wert (von links nach rechts) der ersten Variablen zugewiesen, deren Wert weder null noch undefiniert ist, aber ich habe nicht viel Referenzmaterial zu dieser Technik gefunden und habe Ich habe gesehen, dass es viel benutzt hat.
Ist diese Technik auch spezifisch für JavaScript? Ich weiß, dass etwas Ähnliches in PHP dazu führen würde, f
dass ein echter boolescher Wert und nicht der Wert von sich d
selbst vorliegt.
$f=$a or $f=$b or $f=$c; // etc
. PHP hat sowohl den||
Operator als auch denor
Operator, die den gleichen Job machen. jedochor
ausgewertet wird nach Zuordnung während||
vor ausgewertet wird. Dies gibt Ihnen auch den perlischen Stil von$a=getSomething() or die('oops');
$f = $a ?: $b ?: $c;
??
dies verwenden.$a = $b ?? 'default'
$a
wird also der Wert von$b
if$b
is true zugewiesen , other'default'
?Antworten:
Erläuterungen finden Sie unter Kurzschlussauswertung . Es ist eine übliche Methode, diese Operatoren zu implementieren. Es ist nicht nur in JavaScript verfügbar.
quelle
if( true == f )
. Wenn eine Ganzzahl in f gespeichert wurde, gibt dieser Test immer false zurück.if(true == f)
, das ist das gleiche wieif(f)
: der Test passieren. Wenn Sie auch den Typ von testen möchtenf
, verwenden Sie einen strengen Vergleich :if(true === f)
, der in der Tat fehlschlägt.Dies wird vorgenommen, um einen Standardwert zuzuweisen , in diesem Fall den Wert von
y
, wenn diex
Variable falsch ist .Die booleschen Operatoren in JavaScript können einen Operanden zurückgeben und nicht immer ein boolesches Ergebnis wie in anderen Sprachen.
Der logische ODER-Operator (
||
) gibt den Wert seines zweiten Operanden zurück, wenn der erste falsch ist, andernfalls wird der Wert des ersten Operanden zurückgegeben.Zum Beispiel:
Falsy Werte sind diejenigen , die coerce zu ,
false
wenn sie in Booleschen Kontext verwendet wird , und sie sind0
,null
,undefined
, eine leere Zeichenfolge,NaN
und natürlichfalse
.quelle
||
exklusiv.&&
Operator hat ein ähnliches Verhalten. Er gibt den Wert des ersten Operanden zurück, wenn er an sich falsch ist, und gibt den Wert des zweiten Operanden zurück, nur wenn der erste wahr ist , z. B.("foo" && "bar") == "bar"
und(0 && "bar") == 0
Javacript verwendet die Kurzschlussauswertung für logische Operatoren
||
und&&
. Es unterscheidet sich jedoch von anderen Sprachen darin, dass es das Ergebnis des letzten Werts zurückgibt, der die Ausführung angehalten hat, anstelle von atrue
oderfalse
value.Die folgenden Werte werden in JavaScript als falsch angesehen.
""
(leerer String)Die folgenden Beispiele ignorieren die Vorrangregeln des Operators und halten die Dinge einfach. Sie zeigen, welcher Wert die Auswertung angehalten hat und als Ergebnis zurückgegeben wird.
Die ersten 5 Werte bis
NaN
sind falsch, daher werden sie alle von links nach rechts ausgewertet, bis sie den ersten Wahrheitswert erfüllen. Dies"Hello"
macht den gesamten Ausdruck wahr, sodass alles weiter oben nicht ausgewertet wird und"Hello"
als Ergebnis des Ausdrucks zurückgegeben wird . Ebenso in diesem Fall:Die ersten 5 Werte sind alle wahr und werden ausgewertet, bis sie den ersten falschen Wert (
null
) erfüllen , wodurch der Ausdruck falsch wird, also2010
nicht mehr ausgewertet wird undnull
als Ergebnis des Ausdrucks zurückgegeben wird.In dem von Ihnen angegebenen Beispiel wird diese Eigenschaft von JavaScript verwendet, um eine Zuweisung auszuführen. Es kann überall dort verwendet werden, wo Sie den ersten Wahrheits- oder Falschwert unter einer Reihe von Werten erhalten müssen. Dieser Code unten weist den Wert
"Hello"
zu,b
da es einfacher ist, einen Standardwert zuzuweisen, als if-else-Prüfungen durchzuführen.Sie können das folgende Beispiel als Ausnutzung dieser Funktion bezeichnen, und ich glaube, es erschwert das Lesen von Code.
Innerhalb der Warnung prüfen wir, ob sie
messages
falsch ist, und wenn ja, bewerten und zurückgebennoNewMessagesText
, andernfalls bewerten und zurückgebennewMessagesText
. Da es in diesem Beispiel falsch ist, halten wir bei noNewMessagesText an und alarmieren"Sorry, you have no new messages."
.quelle
However, it's different to other languages in that it returns the result of the last value that halted the execution, instead of a true, or false value.
Javascript-Variablen werden nicht eingegeben, daher kann f ein ganzzahliger Wert zugewiesen werden, obwohl er über boolesche Operatoren zugewiesen wurde.
f wird der nächste Wert zugewiesen, der nicht gleich false ist . Also werden 0, false, null, undefined alle übergangen:
quelle
''
in diesem Fall auch nicht gleich falsch.f is assigned the NEAREST value
was hier ein ziemlich wichtiger Punkt ist.||
Operator, der ein boolescher Operator ist, hat zwei Operanden: eine linke und eine rechte Seite. Wenn die linke Seite des||
ist truthy , wird die Operation Entschlüssen auf der linken Seite und der rechten Seite ignoriert. Wenn die linke Seite falsch ist , wird sie auf der rechten Seite aufgelöst. Also wirdnull || undefined || 4 || 0
tatsächlich aufgelöst, zuundefined || 4 || 0
welchem aufgelöst wird, zu4 || 0
welchem aufgelöst wird4
.Es gibt keine Magie. Boolesche Ausdrücke wie
a || b || c || d
werden träge ausgewertet. Interpeter sucht nach dem Wert vona
, es ist undefiniert, also ist es falsch, also geht es weiter, dann sieht es,b
was null ist, was immer noch ein falsches Ergebnis liefert, also geht es weiter, dann sieht esc
- dieselbe Geschichte. Schließlich siehtd
und sagt es "huh, es ist nicht null, also habe ich mein Ergebnis" und weist es der endgültigen Variablen zu.Dieser Trick funktioniert in allen dynamischen Sprachen, in denen boolesche Ausdrücke verzögert kurzgeschlossen werden. In statischen Sprachen wird es nicht kompiliert (Typfehler). In Sprachen, die gerne boolesche Ausdrücke auswerten, wird ein logischer Wert zurückgegeben (dh in diesem Fall true).
quelle
d
zugewiesen, unabhängig davon, ob er null / undefiniert war oder nicht.||
Operator löst immer den gesamten Operanden auf der rechten Seite auf, wenn die linke Seite falsch ist. Als boolescher Operator werden nur zwei Eingaben angezeigt: die linke und die rechte Seite. Der Parser sieht sie nicht als eine Reihe von Begriffen, daher hört er nicht auf, wenn er den ersten Wahrheitswert findet, es sei denn, dieser Wert ist auch der linke Operand eines anderen||
.Diese Frage hat bereits mehrere gute Antworten erhalten.
Zusammenfassend nutzt diese Technik eine Funktion zum Kompilieren der Sprache. Das heißt, JavaScript "schließt" die Auswertung von Booleschen Operatoren kurz und gibt den Wert zurück, der entweder dem ersten nicht falschen Variablenwert oder dem, was die letzte Variable enthält, zugeordnet ist. Siehe Anurags Erklärung der Werte, die als falsch ausgewertet werden.
Die Verwendung dieser Technik ist aus mehreren Gründen keine gute Praxis. jedoch.
Dokumentierte Funktionen: Es gibt eine Alternative, die diese Anforderungen erfüllt und in mehreren Sprachen konsistent ist. Dies wäre der ternäre Operator:
()? Wert 1: Wert 2.
Die Verwendung des ternären Operators erfordert etwas mehr Eingabe, unterscheidet jedoch deutlich zwischen dem ausgewerteten Booleschen Ausdruck und dem zugewiesenen Wert. Darüber hinaus kann es verkettet werden, sodass die oben ausgeführten Standardzuweisungstypen neu erstellt werden können.
quelle
potentially be targeted for change in the future.
Ja, aber das gilt nicht für Javascript.a || b || c || d || e
?Gibt den ersten wahren Wert der Ausgabe zurück .
Wenn alle falsch sind, geben Sie den letzten falschen Wert zurück.
Beispiel:-
quelle
Es setzt die neue Variable (
z
) entweder auf den Wertx
"wahr" (nicht Null, ein gültiges Objekt / Array / Funktion / was auch immer) oder aufy
andere Weise. Es ist eine relativ häufige Methode, einen Standardwert anzugeben, falls dieserx
nicht vorhanden ist.Wenn Sie beispielsweise eine Funktion haben, die einen optionalen Rückrufparameter verwendet, können Sie einen Standardrückruf bereitstellen, der nichts bewirkt:
quelle
Dies bedeutet, dass wenn
x
gesetzt ist, der Wert fürz
istx
, andernfalls, wenn gesetzty
ist, wird sein Wert als derz
Wert von gesetzt.es ist das gleiche wie
Dies ist möglich, weil logische Operatoren in JavaScript keine booleschen Werte zurückgeben, sondern den Wert des letzten Elements, das zum Abschließen der Operation benötigt wird (in einem ODER-Satz wäre dies der erste nicht falsche Wert, in einem UND-Satz der letzte ). Wenn der Vorgang fehlschlägt,
false
wird er zurückgegeben.quelle
||
Operator nur den zweiten Wert zurück, unabhängig davon, ob er wahr ist oder nicht.z
der Wert festgelegt wird,x
wenn dieser Wert wahr ist . Andernfalls wird der Wert auf gesetzty
. Dies bedeutet, dass wennx
zum Beispiel0
oder die leere Zeichenfolge festgelegt ist""
, dies nicht das tut, was Sie sagen, da diese Werte falsch sind .Es heißt Kurzschlussoperator.
Die Kurzschlussauswertung besagt, dass das zweite Argument nur ausgeführt oder ausgewertet wird, wenn das erste Argument nicht ausreicht, um den Wert des Ausdrucks zu bestimmen. Wenn das erste Argument der Funktion OR (||) als wahr ausgewertet wird, muss der Gesamtwert wahr sein.
Es kann auch verwendet werden, um einen Standardwert für das Funktionsargument festzulegen. "
quelle
Es wertet X aus und wenn X nicht null ist, die leere Zeichenfolge oder 0 (logisch falsch), wird es z zugewiesen. Wenn X null ist, die leere Zeichenfolge oder 0 (logisch falsch), wird z y zugewiesen.
Gibt 'bob' aus;
quelle
false
, aber leere Arrays oder Objekte werden dazu gezwungentrue
.Laut dem Blog- Beitrag von Bill Higgins ; In der logischen ODER-Zuweisungssprache Javascript (Februar 2007) gilt dieses Verhalten ab Version 1.2 (mindestens).
Er schlägt auch eine andere Verwendung dafür vor (zitiert): " leichte Normalisierung von browserübergreifenden Unterschieden "
quelle