Was ist der Doppelrohrbetreiber ( ||)?
Der Doppelrohroperator ( ||) ist der logische OROperator . 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 trueund 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, xwird ein wahrheitsgemäßer Wert zurückgegeben. Wenn Sie es später in ifAbschnitt 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 xes falsch eitherXorYwäre , wäre es y. In diesem Fall würden Sie das "Either x or y is truthy."Wenn bekommen, das ywahr 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 || ybedeutet. Wenn xes wahr ist, xwird zugewiesen x, so dass eigentlich nichts passiert; sonst yist 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 undefinedoder 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 falseals flagAParameter übergeben würden (da es boolesch ist, dh trueoder sein kann false)? Es würde werden true. In diesem Beispiel gibt es keine Möglichkeit, festgelegt flagAzu false.
Es wäre eine bessere Idee, explizit zu prüfen, ob dies so flagAist 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 .
falsynicht NUR istundefined. Die Häufigkeit, die ich gesehen habedoWeDoIt = doWeDoIt || true, reicht aus, um mich zum Weinen zu bringen. (dhdoWeDoItwird es jetzt nie seinfalse)