Gibt es in Javascript einen Null-Koaleszenz-Operator?
In C # kann ich beispielsweise Folgendes tun:
String someString = null;
var whatIWant = someString ?? "Cookies!";
Die beste Annäherung, die ich für Javascript herausfinden kann, ist die Verwendung des bedingten Operators:
var someString = null;
var whatIWant = someString ? someString : 'Cookies!';
Welches ist irgendwie icky IMHO. Kann ich es besser machen
javascript
operators
null-coalescing-operator
null-coalescing
Daniel Schaffer
quelle
quelle
x ?? y
Syntax befindet sich jetzt im Status des Vorschlags der Stufe 1 - nullish coalescingx ?? y
) und der optionale Chaining Operator (user.address?.street
) sind jetzt beide Stufe 4. Hier ist eine gute Beschreibung dessen, was das bedeutet: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Antworten:
Aktualisieren
JavaScript unterstützt jetzt den nullish coalescing operator (??) . Es gibt seinen Operanden auf der rechten Seite zurück, wenn sein Operand auf der linken Seite
null
oder istundefined
, und gibt ansonsten seinen Operanden auf der linken Seite zurück.Bitte überprüfen Sie die Kompatibilität, bevor Sie es verwenden.
Das JavaScript-Äquivalent des C # -Null-Koaleszenzoperators (
??
) verwendet ein logisches ODER (||
):Es gibt Fälle (unten erläutert), in denen das Verhalten nicht mit dem von C # übereinstimmt. Dies ist jedoch die allgemeine, knappe Methode zum Zuweisen von Standard- / Alternativwerten in JavaScript.
Klärung
Unabhängig vom Typ des ersten Operanden wird bei der Umwandlung in einen Booleschen
false
Wert der zweite Operand verwendet. Achten Sie auf alle folgenden Fälle:Das heisst:
quelle
||
der erste "truey" -Wert oder der letzte "falsey" -Wert zurückgegeben wird (wenn keiner als true ausgewertet werden kann) und dass dies&&
umgekehrt funktioniert: Rückgabe des letzten truey-Werts oder des ersten falsey-Werts.var whatIWant = new Number(0) || 42; // is Number {[[PrimitiveValue]]: 0} var whatIWant = new String("") || "a million bucks"; // is String {length: 0, [[PrimitiveValue]]: ""}
var value = myObj && myObj.property || ''
wird zurückgreifen,''
wenn entweder myObj oder myObj.property falsch ist.Diese Lösung funktioniert wie die SQL-Koaleszenzfunktion, akzeptiert eine beliebige Anzahl von Argumenten und gibt null zurück, wenn keines von ihnen einen Wert hat. Es verhält sich wie das C # ?? Operator in dem Sinne, dass "", false und 0 als NOT NULL betrachtet werden und daher als tatsächliche Werte gelten. Wenn Sie aus einem .net-Hintergrund stammen, ist dies die natürlichste Lösung.
quelle
for(var i in arguments)
Iterationsreihenfolge wird laut MDN nicht garantiert . Siehe auch Warum wird die For… In-Schleife von JavaScript für Arrays nicht empfohlen? und warum ist die Verwendung von "for ... in" mit Array-Iteration eine so schlechte Idee? .Ja, es kommt bald. Siehe Vorschlag hier und Implementierungsstatus hier .
Es sieht aus wie das:
Beispiel
quelle
x ?? y
) und der optionale Chaining Operator (user.address?.street
) sind jetzt beide Stufe 4. Hier ist eine gute Beschreibung dessen, was das bedeutet: 2ality.com/2015/11/tc39-process.html#stage-4%3A-finished .Wenn
||
als Ersatz für C #??
in Ihrem Fall nicht gut genug ist, weil leere Zeichenfolgen und Nullen verschluckt werden, können Sie jederzeit Ihre eigene Funktion schreiben:quelle
false
wenn (streng) null / undefiniert undtrue
anderweitig - mit einem logischen oder; Es könnte lesbarer sein als viele verschachtelte Funktionsaufrufe. zB$N(a) || $N(b) || $N(c) || d
ist besser lesbar als$N($N($N(a, b), c), d)
.if .. return .. else ... return
ist der perfekte Fall für einen ternären.return (value === null || value === void 0) ? ifnull : value;
Niemand hat hier das Potenzial für erwähnt
NaN
, das für mich auch ein Nullwert ist. Also dachte ich, ich würde meine zwei Cent hinzufügen.Für den angegebenen Code:
Wenn Sie den
||
Operator verwenden, erhalten Sie den ersten nicht falschen Wert:Wenn Sie die typische coalesce Methode verwenden, wie hier aufgelistet , die Sie erhalten
c
, was den Wert hat:NaN
Beides scheint mir nicht richtig zu sein. In meiner eigenen kleinen Welt der Koaleszenzlogik, die sich von Ihrer Welt unterscheiden kann, betrachte ich undefiniert, null und NaN als alles "null-ish". Ich würde also erwarten,
d
von der Koaleszenzmethode zurück zu kommen (Null).Wenn jemandes Gehirn wie meins funktioniert und Sie es ausschließen möchten
NaN
, wird diese Methode Folgendes erreichen:Für diejenigen, die den Code so kurz wie möglich halten möchten und sich nicht um ein wenig Unklarheit kümmern möchten, können Sie diesen auch verwenden, wie von @impinball vorgeschlagen. Dies nutzt die Tatsache aus, dass NaN niemals gleich NaN ist. Mehr dazu lesen Sie hier: Warum ist NaN nicht gleich NaN?
quelle
typeof
+num.toString() === 'NaN'
ist redundant) und speichern Sie das aktuelle Argument in einer Variablen anstelle vonarguments[i]
.!== 'number'
Prüfung technisch entfernen , da ich bereits ausgewertet habe, dass dies nicht dernull
Fall istundefined
, aber dies hat den Vorteil, dass es für jeden, der diesen Code liest, sehr klar ist und die Bedingung unabhängig von der Reihenfolge funktioniert. Ihre anderen Vorschläge verkürzen den Code geringfügig, daher werde ich diese verwenden.arg !== arg
, aber du musst ihn seinarg === arg
... dann funktioniert er. Dies hat jedoch den Nachteil, dass es sehr unklar ist, was Sie tun ... erfordert einen Kommentar im Code, um zu verhindern, dass er von der nächsten Person entfernt wird, die den Code durchläuft und fürarg === arg
überflüssig hält ... aber ich werde ihn aufstellen wie auch immer.Achten Sie auf die JavaScript-spezifische Definition von null. Es gibt zwei Definitionen für "kein Wert" in Javascript. 1. Null: Wenn eine Variable null ist, bedeutet dies, dass sie keine Daten enthält, die Variable jedoch bereits im Code definiert ist. so was:
In diesem Fall ist der Typ Ihrer Variablen tatsächlich Objekt. Probier es aus.
Undefiniert: Wenn eine Variable zuvor nicht im Code definiert wurde und erwartungsgemäß keinen Wert enthält. so was:
In diesem Fall ist der Typ Ihrer Variablen "undefiniert".
Beachten Sie, dass JavaScript bei Verwendung des Vergleichsoperators für die Typkonvertierung (==) für beide Leerwerte gleichermaßen funktioniert. Verwenden Sie zur Unterscheidung immer den typenstrengen Vergleichsoperator (===).
quelle
var u = undefined;
Nachdem Sie Ihre Erläuterungen gelesen haben, finden Sie in der Antwort von @Ates Goral die Vorgehensweise für denselben Vorgang, den Sie in C # in JavaScript ausführen.
Die Antwort von @ Gumbo bietet die beste Möglichkeit, nach Null zu suchen. jedoch ist es wichtig , den Unterschied in zu beachten , im
==
Vergleich zu===
in JavaScript vor allem , wenn es um Fragen der Kontrolle fürundefined
und / odernull
.Es ist ein wirklich guter Artikel über den Unterschied in beiden Begriffe hier . Verstehen Sie grundsätzlich, dass JavaScript bei Verwendung von
==
anstelle von===
JavaScript versucht, die zu vergleichenden Werte zusammenzuführen und das Ergebnis des Vergleichs nach dieser Verschmelzung zurückzugeben.quelle
Beachten Sie, dass die Toolkette von React
create-react-app
das Null-Coalescing seit Version 3.3.0 (veröffentlicht am 5.12.2019) unterstützt . Aus den Versionshinweisen:Dieser sagte, falls Sie verwenden
create-react-app
3.3.0+ können Sie die Null-coalesce Betreiber bereits heute in Ihrem Reagieren Anwendungen beginnen.quelle
Ja, und sein Vorschlag ist jetzt Stufe 4 . Dies bedeutet, dass der Vorschlag zur Aufnahme in den formalen ECMAScript-Standard bereit ist. Sie können es bereits in neueren Desktop-Versionen von Chrome, Edge und Firefox verwenden, aber wir müssen etwas länger warten, bis diese Funktion die browserübergreifende Stabilität erreicht.
Schauen Sie sich das folgende Beispiel an, um sein Verhalten zu demonstrieren:
Das vorherige Beispiel entspricht:
Beachten Sie, dass nullish Koaleszierstruktur wird nicht Bedrohung falsy Werte die Art und Weise der
||
Bediener hat (es nur prüft , obundefined
odernull
Werte), daher der folgende Ausschnitt wirkt wie folgt:Für TypesScript-Benutzer, die mit TypeScript 3.7 beginnen , ist diese Funktion jetzt auch verfügbar.
quelle
Es wird hoffentlich bald in Javascript verfügbar sein, da es sich ab April 2020 in der Vorschlagsphase befindet. Sie können den Status hier auf Kompatibilität und Support überwachen - https://developer.mozilla.org/en-US/docs/Web/ JavaScript / Reference / Operators / Nullish_coalescing_operator
Für Benutzer von Typescript können Sie den nullish coalescing-Operator von verwenden Typescript Typescript 3.7 verwenden
Aus den Dokumenten -
quelle
Ok eine richtige Antwort
Existiert es in JavaScript? Ja tut es. ABER. Es ist derzeit ab dem 06.02.2020 in Phase 3 und wird noch nicht überall unterstützt.Folgen Sie dem Link in der unten stehenden URL und gehen Sie zu den Überschriften "Spezifikationen" und "Browserkompatibilität", um weitere Informationen zu erhalten.
Zitat aus: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator
Willst du Beispiele? Folgen Sie dem Link, den ich gepostet habe, es hat alles.
quelle
Jetzt bietet es volle Unterstützung in der neuesten Version der wichtigsten Browser wie Chrome, Edge, Firefox, Safari usw. Hier ist der Vergleich zwischen dem Null-Operator und dem Nullish Coalescing-Operator
quelle