Was ist der Doppelrohrbetreiber ( ||
)?
Der Doppelrohroperator ( ||
) ist der logische OR
Operator . In den meisten Sprachen funktioniert es folgendermaßen:
- Wenn der erste Wert ist
false
, wird der zweite Wert überprüft. Wenn es so ist true
, kehrt es zurück true
und wenn es so ist false
, kehrt es zurück false
.
- Wenn der erste Wert ist
true
, wird immer zurückgegeben true
, unabhängig vom zweiten Wert.
Im Grunde funktioniert es also wie folgt:
function or(x, y) {
if (x) {
return true;
} else if (y) {
return true;
} else {
return false;
}
}
Wenn Sie immer noch nicht verstehen, schauen Sie sich diese Tabelle an:
| true false
------+---------------
true | true true
false | true false
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:
(function(){}) || {}
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 werden false
; sonst wird es behandelt als true
.
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:
- Wenn der erste Wert falsey ist , wird der zweite Wert zurückgegeben .
- Wenn der erste Wert wahr ist , wird der erste Wert zurückgegeben .
Überrascht? Eigentlich ist es "kompatibel" mit dem traditionellen ||
Operator. Es könnte wie folgt geschrieben werden:
function or(x, y) {
if (x) {
return x;
} else {
return y;
}
}
Wenn Sie einen wahrheitsgemäßen Wert als übergeben x
, x
wird ein wahrheitsgemäßer Wert zurückgegeben. Wenn Sie es später in if
Abschnitt verwenden:
(function(x, y) {
var eitherXorY = x || y;
if (eitherXorY) {
console.log("Either x or y is truthy.");
} else {
console.log("Neither x nor y is truthy");
}
}(true/*, undefined*/));
du bekommst "Either x or y is truthy."
.
Wenn x
es falsch eitherXorY
wäre , wäre es y
. In diesem Fall würden Sie das "Either x or y is truthy."
Wenn bekommen, das y
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 dies x = x || y
bedeutet. Wenn x
es wahr ist, x
wird zugewiesen x
, so dass eigentlich nichts passiert; sonst y
ist zugeordnet x
. 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 unbedingt undefined
oder ist null
) als Parameter zu übergeben. Betrachten Sie folgendes Beispiel:
function badFunction(/* boolean */flagA) {
flagA = flagA || true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
Es sieht auf den ersten Blick gültig aus. Was würde jedoch passieren, wenn Sie false
als flagA
Parameter übergeben würden (da es boolesch ist, dh true
oder sein kann false
)? Es würde werden true
. In diesem Beispiel gibt es keine Möglichkeit, festgelegt flagA
zu false
.
Es wäre eine bessere Idee, explizit zu prüfen, ob dies so flagA
ist undefined
:
function goodFunction(/* boolean */flagA) {
flagA = typeof flagA !== "undefined" ? flagA : true;
console.log("flagA is set to " + (flagA ? "true" : "false"));
}
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 .
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
)