Menu

null vs undefined in JavaScript: Der Unterschied erklärt

Was null und undefined in JavaScript wirklich unterscheidet, wie du sauber auf beide prüfst und wann du welchen Wert tatsächlich selbst setzen solltest.

Zwei Arten, „nichts" zu sagen

Die meisten Sprachen haben genau einen Wert für „nicht vorhanden". JavaScript hat gleich zwei davon: null und undefined. Sie verhalten sich ähnlich genug, um Einsteiger zu verwirren, und unterschiedlich genug, um auch erfahrene Entwickler zu ärgern. Den Unterschied zwischen null und undefined zu verstehen, ist die zehn Minuten wirklich wert.

Die Kurzfassung:

  • undefined bekommst du von JavaScript selbst, wenn irgendwo ein Wert fehlt.
  • null schreibst du hin, wenn du bewusst sagen willst: „hier steht absichtlich nichts".
index.js
Output
Click Run to see the output here.

Achte auf das Muster: Jedes undefined oben ist entstanden, weil JavaScript keinen Wert finden konnte. Das null hingegen war eine bewusste Entscheidung – jemand hat es explizit hingeschrieben.

Woher kommt undefined?

undefined taucht in einer Handvoll typischer Situationen auf, und alle laufen im Kern auf dasselbe hinaus: "hier ist schlicht kein Wert vorhanden".

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

In jedem dieser Fälle wollte JavaScript einen Wert holen und hat nichts gefunden. undefined ist quasi die Art der Engine zu sagen: „Ich habe nachgeschaut, da war kein Wert."

Du kannst undefined zwar selbst zuweisen (let x = undefined;), aber lass es besser bleiben. undefined soll das Signal dafür bleiben, dass JavaScript selbst nichts gefunden hat. Wenn du bewusst sagen willst „hier ist nichts", nimm null.

Woher null kommt

null taucht nur dort auf, wo es jemand explizit hingeschrieben hat. Genau das ist der Sinn – es ist ein bewusst gesetzter Marker.

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

DOM-APIs arbeiten auffällig oft mit null: document.getElementById("missing") liefert null zurück, nicht undefined. Damit sagt dir der Browser ganz bewusst: „Ich habe gesucht, und die Antwort lautet: kein Element gefunden." Auch JSON.parse("null") gibt dir null – denn JSON kennt undefined schlicht nicht.

Die Faustregel: undefined ist das Fehlen per Default, null ist ein bewusst gesetztes Fehlen.

Die typeof-Eigenart

Und jetzt der berühmte Stolperstein:

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

typeof null liefert "object" zurück – ein Bug aus dem Jahr 1995, den man nie beheben konnte, ohne bestehende Websites kaputtzumachen. Deshalb lebt er bis heute weiter. null ist kein Objekt, sondern ein Primitive, genau wie undefined, Zahlen, Strings oder Booleans. Nur typeof behauptet etwas anderes.

In der Praxis heißt das: Für eine Prüfung auf null ist typeof unbrauchbar. Du solltest stattdessen direkt vergleichen:

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

Oder – was in der Praxis häufiger vorkommt – du prüfst einfach auf beides gleichzeitig. Dazu kommen wir im nächsten Abschnitt.

Auf null oder undefined prüfen: das == null-Idiom

In den meisten Fällen ist es dir egal, welcher der beiden Fehlwerte vorliegt – du willst nur wissen, ob überhaupt ein Wert da ist, bevor du damit weiterarbeitest. Die idiomatische Variante dafür in JavaScript ist der lose Vergleich mit null:

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

value == null ist genau dann true, wenn der Wert null oder undefined ist – und false für alles andere, also auch für 0, "" und false. In den allermeisten Fällen ist genau das gewünscht. Das ist übrigens die eine Situation, in der == dem strikten === vorgezogen wird. Linter wissen das und lassen diese Schreibweise durchgehen.

Wer es lieber ausdrücklich mag, schreibt value === null || value === undefined – das bedeutet dasselbe und liest sich sehr eindeutig.

Nullish-Operatoren: ?? und ?.

Zwei Operatoren wurden extra eingeführt, um den Umgang mit null und undefined zu vereinfachen. Beide behandeln die zwei Werte gleich und lassen alles andere unangetastet.

Der Nullish-Coalescing-Operator (??) liefert nur dann einen Fallback-Wert, wenn die linke Seite null oder undefined ist:

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

Im Gegensatz zu || — das würde 0 durch 3 ersetzen, weil 0 eben falsy ist. ?? geht strenger vor: Es greift ausschließlich bei den beiden nullish-Werten.

Optional Chaining (?.) bricht die Auswertung einer Kette ab und liefert undefined zurück, sobald es auf null oder undefined trifft:

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

Beide Operatoren existieren, weil die Frage „Ist dieser Wert nullish?" einfach ständig auftaucht. Im weiteren Verlauf des Kurses schauen wir sie uns noch im Detail an.

Default-Parameter greifen nur bei undefined

Eine kleine, aber wichtige Feinheit: Standardwerte bei Funktionsparametern springen ausschließlich bei undefined an – bei null nicht.

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

Wird null übergeben, interpretiert JavaScript das als „ich habe mich bewusst für keinen Wert entschieden" – und hält sich daran. Soll auch null den Default-Wert auslösen, greifst du innerhalb der Funktion zum Nullish-Coalescing-Operator ??:

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

Diese Unterscheidung sorgt regelmäßig für Verwirrung. Default-Werte kümmern sich um fehlende Argumente; ?? kümmert sich um nullish-Argumente.

JSON und das fehlende undefined

JSON kennt null, aber kein undefined. Das führt beim Serialisieren zu stillen Überraschungen:

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

Das Feld age ist komplett verschwunden — JSON.stringify lässt Properties mit dem Wert undefined einfach unter den Tisch fallen. null dagegen bleibt erhalten, weil JSON diesen Wert kennt. Wenn du ein Objekt einmal durch JSON schickst und wieder zurückholst, gehen undefined-Properties oft unbemerkt verloren.

In Arrays wird aus undefined wiederum null:

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

Wenn du ein API-Payload entwirfst, nimm lieber null statt undefined für Felder ohne Wert. null übersteht die Serialisierung, undefined nicht.

Wann nimmt man was?

Eine sinnvolle Konvention für deinen eigenen Code:

  • Lass undefined für „nicht angegeben" stehen — fehlende Argumente, nicht gesetzte Variablen, nicht vorhandene Properties. Weise undefined nicht manuell zu.
  • Nimm null, wenn du bewusst ausdrücken willst: „das ist absichtlich leer" — ein ausgeloggter User, eine nicht ausgewählte Option, ein geleertes Formularfeld.
  • An API-Grenzen solltest du beides akzeptieren (mit == null oder ??), aber konsistent sein bei dem, was du selbst erzeugst.

Einige Style Guides (unter anderem der von TypeScript) verzichten komplett auf null und nutzen ausschließlich undefined. Das lässt sich gut vertreten — ein Wert ist einfacher als zwei. Leg pro Projekt eine Regel fest und zieh sie überall durch.

Als Nächstes: Type Coercion

null und undefined verhalten sich auf ganz eigene Weise, wenn JavaScript sie in Zahlen, Strings oder Booleans umwandelt — Number(null) ergibt 0, Number(undefined) dagegen NaN. Genau solche Asymmetrien sorgen in der Praxis für echte Bugs. Als Nächstes geht's um Type Coercion, und sobald du die kompletten Regeln kennst, verlieren viele JavaScript-Eigenheiten ihren Mysterium-Status.

Häufig gestellte Fragen

Was ist der Unterschied zwischen null und undefined in JavaScript?

undefined bedeutet, dass einem Wert schlicht noch nichts zugewiesen wurde – das bekommst du bei nicht initialisierten Variablen, fehlenden Funktionsargumenten oder nicht existierenden Objekteigenschaften. null dagegen ist ein bewusstes „hier steht absichtlich nichts“, das du selbst setzt. JavaScript vergibt null nie von sich aus, das musst du aktiv hinschreiben.

Wie prüfe ich auf null und undefined gleichzeitig?

Mit value == null. Die lose Gleichheit behandelt null und undefined als gleichwertig zueinander, aber zu sonst nichts – x == null ist also genau für diese beiden Werte true. Das ist die einzige Stelle, an der == statt === als idiomatisch und sicher gilt.

Warum liefert typeof null eigentlich 'object' zurück?

Das ist ein Bug aus der allerersten JavaScript-Version, der sich nicht mehr beheben lässt, ohne das halbe Web zu zerlegen. typeof null gibt 'object' zurück, obwohl null ein primitiver Wert ist. Wenn du gezielt auf null prüfen willst, vergleich direkt: value === null.

Sollte ich in eigenem Code lieber null oder undefined verwenden?

Lass undefined für „wurde nicht angegeben“ stehen und nimm null, wenn du bewusst signalisieren willst: „hier ist absichtlich nichts drin“. Viele Projekte – inklusive der TypeScript-Styleguides – verzichten komplett auf null und arbeiten nur mit undefined. Wichtig ist: entscheide dich pro Projekt für eine Linie und zieh sie durch.

Lerne mit Coddy zu programmieren

LOS GEHT'S