Menu

Nullish Coalescing (??) in JavaScript richtig nutzen

Wie der ??-Operator nur dann einen Default setzt, wenn ein Wert wirklich null oder undefined ist – und warum das in der Praxis oft sauberer ist als ||.

Ein schlauerer Defaultwert

Für Defaultwerte gab es in JavaScript schon immer eine schnelle Abkürzung: value || fallback. Funktioniert meistens – hat aber einen eingebauten Haken: Jeder falsy-Wert löst den Fallback aus. 0, '' und false springen auf den Ersatzwert, auch wenn sie eigentlich die richtige Antwort wären.

Der Nullish-Coalescing-Operator ?? räumt damit auf. Er greift nur bei null oder undefined auf den Fallback zurück:

index.js
Output
Click Run to see the output here.

0 und '' überleben. null und undefined nicht. Mehr macht der Operator nicht.

Warum || hier nicht reicht

Hier ist der klassische Bug, den ?? verhindern soll:

index.js
Output
Click Run to see the output here.

Der Nutzer wollte Lautstärke 0 (also Stille) und einen leeren Nickname. Beides wurde stillschweigend überschrieben, weil || nicht zwischen "nicht vorhanden" und "falsy" unterscheiden kann.

Lösung: einfach ?? verwenden:

index.js
Output
Click Run to see the output here.

Jetzt werden 0 und '' unverändert durchgereicht, und nur tatsächlich fehlende Felder bekommen den Defaultwert. Genau das willst du in fast allen Fällen.

Das mentale Modell

?? stellt genau eine Frage: Ist der Wert links null oder undefined? Alles andere zählt nicht.

Wert linksleft || right liefertleft ?? right liefert
nullrightright
undefinedrightright
0rightleft (0)
''rightleft ('')
falserightleft (false)
NaNrightleft (NaN)
beliebiges Objektleftleft

Nimm ??, wenn deine Daten sinnvolle falsy-Werte enthalten können. Nimm ||, wenn du wirklich jeden falsy-Wert aussortieren willst (leere Strings, Null-Zählerstände usw.) — den Fall gibt es, aber er ist seltener, als viele denken.

Kurzschluss-Auswertung

Wie || und && wertet auch ?? per Kurzschluss aus. Ist der linke Wert nicht nullish, wird die rechte Seite gar nicht erst ausgeführt:

index.js
Output
Click Run to see the output here.

expensiveDefault() wird nur einmal ausgeführt – nämlich für b. Praktisch wird das immer dann, wenn dein Fallback ein Funktionsaufruf, ein Netzwerk-Request oder sonst irgendetwas ist, das du dir sparen möchtest, wenn es nicht gebraucht wird.

Optional Chaining und Nullish Coalescing kombinieren

?? und ?. wurden in ES2020 gemeinsam eingeführt und sind als Team gedacht. Optional Chaining hangelt sich durch einen möglicherweise nicht existierenden Pfad und liefert undefined, sobald ein Zwischenschritt fehlt. Der Nullish-Coalescing-Operator setzt dann einen sinnvollen Standardwert ein:

index.js
Output
Click Run to see the output here.

Ohne dieses Duo wird aus demselben Code entweder eine hässliche Kette von &&-Prüfungen oder ein try/catch-Block. Mit den beiden passen sicherer Zugriff und sinnvolle Defaultwerte in eine einzige Zeile.

Nullish Assignment mit ??=

a ??= b weist a nur dann den Wert b zu, wenn a entweder null oder undefined ist. Das ist der sogenannte Nullish Coalescing Assignment Operator, und er arbeitet mit Short-Circuit-Auswertung: Hat a bereits einen Wert, wird die rechte Seite gar nicht erst ausgewertet.

index.js
Output
Click Run to see the output here.

Beachte, dass verbose: false und retries: 0 erhalten bleiben – ??= füllt wirklich nur das auf, was fehlt. Im Gegensatz dazu würde ||= beide Werte überschreiben.

Operatorrangfolge und die Klammerregel

?? weigert sich bewusst, ohne Klammern mit || oder && kombiniert zu werden. Folgendes wirft einen SyntaxError:

const x = a || b ?? c;   // SyntaxError

Die Sprachdesigner fanden die Vorrangregeln hier uneindeutig genug, um dich zur Klarstellung zu zwingen. Mit Klammern funktioniert's dann problemlos:

index.js
Output
Click Run to see the output here.

Unterschiedliche Klammerung, unterschiedliches Ergebnis. Die Klammern sind nicht nur Deko – sie zeigen späteren Lesern (und dem Parser) unmissverständlich, was du eigentlich gemeint hast.

Nicht dasselbe wie ein Default-Parameter

Default-Parameter in Funktionssignaturen folgen ihrer eigenen Regel: Sie greifen nur, wenn das Argument undefined ist – bei null nicht. Das ist ein feiner, aber wichtiger Unterschied zum ??-Operator, der beide Fälle gleich behandelt.

index.js
Output
Click Run to see the output here.

Wenn auch null den Fallback auslösen soll, nutze ?? innerhalb des Funktionsrumpfs:

index.js
Output
Click Run to see the output here.

Kleiner Unterschied, aber leicht zu übersehen – vor allem, wenn eine API dir null für „kein Wert gesetzt" zurückgibt.

Wann du zu ?? greifen solltest

Nimm ?? als Standard, solange du keinen konkreten Grund für etwas anderes hast. Dieser Operator passt am besten zu dem, wie Daten in der Praxis aussehen: 0, '' und false sind meistens echte, gewollte Werte – und nur wirklich fehlende Daten sollen durch einen Fallback ersetzt werden. || hebst du dir für die Fälle auf, in denen du tatsächlich jeden falsy-Wert austauschen willst.

Weiter geht's: Klassen

Damit ist das Thema Objekte und Arrays abgeschlossen – du hast jetzt das Handwerkszeug, um Datenstrukturen sauber aufzubauen und sicher durch sie zu navigieren. Im nächsten Kapitel dreht sich alles darum, Verhalten zu strukturieren: Klassen, Vererbung und das Prototypensystem, das im Hintergrund die Arbeit macht.

Häufig gestellte Fragen

Was macht der Nullish-Coalescing-Operator in JavaScript?

?? gibt die rechte Seite nur dann zurück, wenn die linke Seite null oder undefined ist. In allen anderen Fällen bleibt der linke Wert stehen. wert ?? fallback ist also der saubere Weg, einen Default zu setzen, ohne dass gültige „falsy" Werte wie 0 oder '' versehentlich überschrieben werden.

Wo liegt der Unterschied zwischen ?? und || in JavaScript?

|| springt bei jedem falsy-Wert an – also bei 0, '', false, NaN, null und undefined. ?? reagiert dagegen ausschließlich auf null und undefined. Wenn 0 oder ein leerer String in deinen Daten legitime Werte sind, nimm ??. Willst du bewusst alle falsy-Werte rausfiltern, ist || weiterhin die richtige Wahl.

Lässt sich Nullish Coalescing mit Optional Chaining kombinieren?

Ja, und genau dafür ist die Kombi gedacht. user?.settings?.theme ?? 'light' hangelt sich sicher durch die Kette, liefert undefined, falls unterwegs etwas fehlt, und setzt dann 'light' ein. Beide Operatoren kamen nicht umsonst zusammen in ES2020 – sie ergänzen sich perfekt.

Was bewirkt der ??=-Operator?

a ??= b weist a nur dann den Wert b zu, wenn a gerade null oder undefined ist. Es ist die logische Nullish-Zuweisung – praktisch eine Kurzform für a = a ?? b, allerdings mit Short-Circuit: Hat a bereits einen Wert, wird die rechte Seite gar nicht erst ausgewertet. Super praktisch, um fehlende Defaults in einem Options-Objekt aufzufüllen.

Lerne mit Coddy zu programmieren

LOS GEHT'S