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:
undefinedbekommst du von JavaScript selbst, wenn irgendwo ein Wert fehlt.nullschreibst du hin, wenn du bewusst sagen willst: „hier steht absichtlich nichts".
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".
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.
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:
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:
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:
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:
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:
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.
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 ??:
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:
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:
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
undefinedfür „nicht angegeben" stehen — fehlende Argumente, nicht gesetzte Variablen, nicht vorhandene Properties. Weiseundefinednicht 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
== nulloder??), 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.