Ich debugge JavaScript und kann nicht erklären, was dies ||
bewirkt.
function (title, msg) {
var title = title || 'Error';
var msg = msg || 'Error on Request';
}
Kann mir jemand einen Hinweis geben, warum dieser Typ benutzt var title = title || 'ERROR'
? Ich sehe es manchmal auch ohne var
Erklärung.
javascript
parameters
optional-parameters
or-operator
opHASnoNAME
quelle
quelle
falsy
nicht NUR istundefined
. Die Häufigkeit, die ich gesehen habedoWeDoIt = doWeDoIt || true
, reicht aus, um mich zum Weinen zu bringen. (dhdoWeDoIt
wird es jetzt nie seinfalse
)??
. Javascript wertet Nicht-Null-Objekte wietrue
(oder besser Null-Objekte als falsch aus)Antworten:
Dies bedeutet, dass das
title
Argument optional ist. Wenn Sie die Methode ohne Argumente aufrufen, wird der Standardwert von verwendet"Error"
.Es ist eine Abkürzung zum Schreiben:
Diese Art von Kurztrick mit booleschen Ausdrücken ist auch in Perl üblich. Mit dem Ausdruck:
es wird ausgewertet,
true
ob entwedera
oderb
isttrue
. Wenn diesa
zutrifft, müssen Sie dies überhaupt nicht überprüfenb
. Dies wird als boolesche Kurzschlussauswertung bezeichnet.prüft grundsätzlich, ob
title
ausgewertet wirdfalse
. Wenn dies der Fall ist, wird es "zurückgegeben""Error"
, andernfalls wird es zurückgegebentitle
.quelle
Was ist der Doppelrohrbetreiber (
||
)?Der Doppelrohroperator (
||
) ist der logischeOR
Operator . In den meisten Sprachen funktioniert es folgendermaßen:false
, wird der zweite Wert überprüft. Wenn es so isttrue
, kehrt es zurücktrue
und wenn es so istfalse
, kehrt es zurückfalse
.true
, wird immer zurückgegebentrue
, unabhängig vom zweiten Wert.Im Grunde funktioniert es also wie folgt:
Wenn Sie immer noch nicht verstehen, schauen Sie sich diese Tabelle an:
Mit anderen Worten, es ist nur falsch, wenn beide Werte falsch sind.
Wie unterscheidet es sich in JavaScript?
JavaScript ist etwas anders, weil es eine lose getippte Sprache ist . In diesem Fall bedeutet dies, dass Sie einen
||
Operator mit Werten verwenden können, die keine Booleschen Werte sind. Obwohl es keinen Sinn macht, können Sie diesen Operator beispielsweise mit einer Funktion und einem Objekt verwenden:Was passiert da?
Wenn die Werte nicht boolesch sind, konvertiert JavaScript implizit in boolesche Werte . Es bedeutet , dass , wenn der Wert Falsey ist (zB
0
,""
,null
,undefined
(siehe auch alle Falsey Werte in JavaScript )), wird es als behandelt werdenfalse
; sonst wird es behandelt alstrue
.Das obige Beispiel sollte also geben
true
, weil leere Funktion wahr ist. Nun, das tut es nicht. Es gibt die leere Funktion zurück. Das liegt daran, dass der JavaScript-||
Operator nicht so funktioniert, wie ich es am Anfang geschrieben habe. Es funktioniert folgendermaßen:Überrascht? Eigentlich ist es "kompatibel" mit dem traditionellen
||
Operator. Es könnte wie folgt geschrieben werden:Wenn Sie einen wahrheitsgemäßen Wert als übergeben
x
,x
wird ein wahrheitsgemäßer Wert zurückgegeben. Wenn Sie es später inif
Abschnitt verwenden:du bekommst
"Either x or y is truthy."
.Wenn
x
es falscheitherXorY
wäre , wäre esy
. In diesem Fall würden Sie das"Either x or y is truthy."
Wenn bekommen, dasy
wahr ist; sonst würdest du bekommen"Neither x nor y is truthy"
.Die eigentliche Frage
Wenn Sie nun wissen, wie der
||
Operator funktioniert, können Sie wahrscheinlich selbst erkennen, was diesx = x || y
bedeutet. Wennx
es wahr ist,x
wird zugewiesenx
, so dass eigentlich nichts passiert; sonsty
ist zugeordnetx
. Es wird häufig verwendet, um Standardparameter in Funktionen zu definieren. Es wird jedoch oft als schlechte Programmierpraxis angesehen , da es Sie daran hindert, einen Falsey-Wert (der nicht unbedingtundefined
oder istnull
) als Parameter zu übergeben. Betrachten Sie folgendes Beispiel:Es sieht auf den ersten Blick gültig aus. Was würde jedoch passieren, wenn Sie
false
alsflagA
Parameter übergeben würden (da es boolesch ist, dhtrue
oder sein kannfalse
)? Es würde werdentrue
. In diesem Beispiel gibt es keine Möglichkeit, festgelegtflagA
zufalse
.Es wäre eine bessere Idee, explizit zu prüfen, ob dies so
flagA
istundefined
:Obwohl es länger ist, funktioniert es immer und es ist leichter zu verstehen.
Sie können die ES6-Syntax auch für Standardfunktionsparameter verwenden. Beachten Sie jedoch, dass dies in älteren Browsern (wie dem IE) nicht funktioniert. Wenn Sie diese Browser unterstützen möchten, sollten Sie Ihren Code mit Babel transpilieren .
Siehe auch Logische Operatoren auf MDN .
quelle
title = title || 'Error'
bedeutetif (title) { title = title; } else { title = 'Error'; }
title ||= 'Error'
.Wenn der Titel nicht festgelegt ist, verwenden Sie 'ERROR' als Standardwert.
Allgemeiner:
Liest: Stellen Sie foobar auf
foo
oderdefault
. Sie könnten dies sogar viele Male verketten:quelle
Erklären Sie dies ein wenig mehr ...
Der
||
Operator ist der logischeor
Operator. Das Ergebnis ist wahr, wenn der erste Teil wahr ist, und es ist wahr, wenn der zweite Teil wahr ist, und es ist wahr, wenn beide Teile wahr sind. Zur Verdeutlichung steht hier eine Tabelle:Jetzt etwas hier bemerken? Wenn
X
wahr ist, ist das Ergebnis immer wahr. Wenn wir also wissen, dassX
das stimmt, müssen wir das überhaupt nicht überprüfenY
. Viele Sprachen implementieren daher "Kurzschluss" -Auswertungsgeräte für logischesor
(und logischesand
Kommen aus der anderen Richtung). Sie überprüfen das erste Element und wenn das stimmt, kümmern sie sich überhaupt nicht darum, das zweite zu überprüfen. Das Ergebnis (logisch ausgedrückt) ist das gleiche, aber in Bezug auf die Ausführung gibt es möglicherweise einen großen Unterschied, wenn die Berechnung des zweiten Elements teuer ist.Was hat das mit Ihrem Beispiel zu tun?
Schauen wir uns das an. Das
title
Element wird an Ihre Funktion übergeben. Wenn Sie in JavaScript keinen Parameter übergeben, wird standardmäßig ein Nullwert verwendet. Auch in JavaScript wird Ihre Variable von den logischen Operatoren als falsch angesehen, wenn sie ein Nullwert ist. Wenn diese Funktion mit einem angegebenen Titel aufgerufen wird, handelt es sich um einen nicht falschen Wert, der der lokalen Variablen zugewiesen wird. Wenn es jedoch keinen Wert erhält, ist es ein Nullwert und somit falsch. Der logischeor
Operator wertet dann den zweiten Ausdruck aus und gibt stattdessen 'Fehler' zurück. Jetzt erhält die lokale Variable den Wert 'Fehler'.Dies funktioniert aufgrund der Implementierung logischer Ausdrücke in JavaScript. Es wird kein korrekter boolescher Wert (
true
oderfalse
) zurückgegeben, sondern der Wert, der nach einigen Regeln angegeben wurde, was als äquivalenttrue
und was als äquivalent angesehen wirdfalse
. Suchen Sie in Ihrer JavaScript-Referenz nach Informationen darüber, was JavaScript in booleschen Kontexten als wahr oder falsch ansieht.quelle
Double Pipe steht für logisches "ODER". Dies ist nicht wirklich der Fall, wenn der "Parameter nicht gesetzt" ist, da streng im Javascript, wenn Sie Code wie diesen haben:
Dann ruft an
sind nicht gleichwertig.
Double Pipe (||) wandelt das erste Argument in einen Booleschen Wert um. Wenn der resultierende Boolesche Wert wahr ist, führen Sie die Zuweisung aus, andernfalls wird der richtige Teil zugewiesen.
Dies ist wichtig, wenn Sie nach nicht festgelegten Parametern suchen.
Angenommen, wir haben eine Funktion setSalary mit einem optionalen Parameter. Wenn der Benutzer den Parameter nicht angibt, sollte der Standardwert 10 verwendet werden.
Wenn Sie die Prüfung wie folgt durchführen:
Dies führt zu einem unerwarteten Ergebnis bei einem Anruf wie
Es wird weiterhin die 10 nach dem oben beschriebenen Ablauf eingestellt.
quelle
Grundsätzlich wird geprüft, ob der Wert vor dem || liegt wird als wahr ausgewertet. Wenn ja, wird dieser Wert angenommen. Wenn nicht, wird der Wert nach || verwendet.
Werte, für die der Wert nach || angenommen wird (soweit ich mich erinnern kann):
quelle
Obwohl die Antwort von Cletus richtig ist, sollten meines Erachtens weitere Details in Bezug auf "Auswertungen als falsch" in JavaScript hinzugefügt werden.
Überprüft nicht nur, ob title / msg angegeben wurde, sondern auch, ob einer von beiden falsch ist . dh eine der folgenden:
Also in der Schlange
Wenn title wahr ist (dh nicht falsch, also title = "titleMessage" usw.), hat der boolesche OR (||) -Operator einen 'true'-Wert gefunden, was bedeutet, dass er als true ausgewertet wird, also kurzgeschlossen und zurückgegeben wird der wahre Wert (Titel).
Wenn der Titel falsch ist (dh einer der obigen Listen), hat der Boolesche OR-Operator (||) einen 'falschen' Wert gefunden und muss nun den anderen Teil des Operators 'Fehler' auswerten, der als wahr ausgewertet wird und wird daher zurückgegeben.
Es scheint auch (nach einigen schnellen Experimenten mit der Firebug-Konsole), wenn beide Seiten des Operators als falsch bewertet werden, wird der zweite "falsche" Operator zurückgegeben.
dh
Gibt undefiniert zurück. Dies dient wahrscheinlich dazu, dass Sie das in dieser Frage gestellte Verhalten verwenden können, wenn Sie versuchen, den Standardtitel / die Standardnachricht auf "" zu setzen. dh nach dem Laufen
foo würde auf "" gesetzt sein
quelle
Doppelrohrbetreiber
ist dieses Beispiel nützlich?
kann auch sein
quelle
Um allen vor mir Gesagten eine Erklärung hinzuzufügen, möchte ich Ihnen einige Beispiele geben, um logische Konzepte zu verstehen.
Dies bedeutet, wenn die linke Seite als echte Aussage ausgewertet wird, wird sie beendet und die linke Seite wird zurückgegeben und der Variablen zugewiesen. In anderen Fällen wird die rechte Seite zurückgegeben und zugewiesen.
Und der Bediener hat die entgegengesetzte Struktur wie unten.
quelle
|| ist der boolesche ODER-Operator. Wie in Javascript werden undefiniert, null, 0, falsch als falsche Werte betrachtet.
Es bedeutet einfach
quelle
Zitat: "Was bedeutet das Konstrukt x = x || y?"
Zuweisen eines Standardwerts.
Dies bedeutet, dass x ein Standardwert von y angegeben wird , falls x noch auf seinen Wert wartet, ihn aber noch nicht erhalten hat oder absichtlich weggelassen wurde, um auf einen Standardwert zurückzugreifen.
quelle
function getKeys(x) { x = x || this ; .... }
Dies könnte ohne Änderung als eigenständige Funktion, als Eigenschaftsmethode in Prototypen und als Methode eines Elements verwendet werden, das ein anderes Element als Argument als "[Element] .getKeys (anotherElement)" erhalten kann.Und ich muss noch etwas hinzufügen: Diese Abkürzung ist ein Greuel. Es missbraucht eine versehentliche Interpreteroptimierung (die sich nicht um die zweite Operation kümmert, wenn die erste wahr ist), um eine Zuweisung zu steuern. Diese Verwendung hat nichts mit dem Zweck des Betreibers zu tun. Ich glaube nicht, dass es jemals benutzt werden sollte.
Ich bevorzuge den ternären Operator für die Initialisierung, z.
Dies verwendet eine einzeilige bedingte Operation für den richtigen Zweck. Es spielt immer noch unansehnliche Spiele mit Wahrhaftigkeit, aber das ist Javascript für Sie.
quelle