Menu

JavaScript Default-Parameter: Optionale Argumente nutzen

Wie Parameter in JavaScript wirklich funktionieren: Default-Werte setzen, wann undefined greift, Auswertungsreihenfolge und der Unterschied zwischen Parametern und Argumenten.

Parameter vs. Argument

Zwei Begriffe, die ständig durcheinandergeworfen werden. Ein Parameter ist der Name in der Funktionsdefinition. Ein Argument ist der Wert, den du beim Aufruf übergibst. Das Prinzip ist dasselbe wie in Python und den meisten anderen Sprachen:

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

a und b sind Parameter. 2 und 3 sind Argumente. JavaScript ordnet sie positionsbasiert zu – das erste Argument landet beim ersten Parameter und so weiter. Der Unterschied klingt pedantisch, aber genau dieses Vokabular taucht in Fehlermeldungen und auf MDN auf.

JavaScript nimmt es mit der Argumentanzahl nicht so genau

Anders als viele Sprachen stört sich JavaScript nicht daran, ob du zu wenige oder zu viele Argumente übergibst. Fehlende Parameter werden einfach zu undefined, überzählige werden stillschweigend ignoriert:

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

Der erste Aufruf gibt Hallo, Ada undefined aus – last hat keinen Wert bekommen, also ist es undefined, und Template Literals interpolieren das klaglos mit. Keine Exception, keine Warnung. Diese Nachsicht ist mal praktisch, mal die Ursache fieser Bugs – und genau deshalb gibt es Default-Parameter.

Standardwert für einen Parameter festlegen

Schreibe einfach = und einen Wert hinter den Parameternamen. Wenn der Aufrufer dieses Argument nicht übergibt (oder explizit undefined übergibt), springt der Default-Wert ein:

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

Alle drei Aufrufe funktionieren. Beim ersten und dritten greift der Default-Wert, beim zweiten wird der übergebene Wert verwendet. Das ist ES6-Syntax – vor 2015 musste man noch name = name || "friend" im Funktionsrumpf schreiben, was bei falsy-Werten wie 0 oder "" seine eigenen Tücken hatte.

Als Default-Parameter sind übrigens beliebige Ausdrücke erlaubt, nicht nur Literale:

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

Der Ausdruck wird bei jedem Aufruf neu ausgewertet, nicht einmalig beim Definieren der Funktion. Die berüchtigte Mutable-Default-Falle aus Python gibt es hier also nicht — jeder Aufruf bekommt ein frisches new Date().

Nur undefined löst den Default-Wert aus

Das ist die Regel, über die viele stolpern: Default-Parameter greifen nur, wenn das Argument undefined ist — nicht bei jedem falsy-Wert und erst recht nicht bei null:

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

Nur der letzte Aufruf verwendet tatsächlich "Freund". Wenn du null explizit übergibst, sagst du damit: „Der Wert ist null" — und JavaScript nimmt dich beim Wort. Genauso verhält es sich mit leeren Strings oder Nullen: Das sind Werte, keine fehlenden Argumente.

Möchtest du null wie einen fehlenden Parameter behandeln, musst du das selbst abfangen:

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

Der ??-Operator (Nullish Coalescing) behandelt sowohl null als auch undefined als "fehlt". Mehr dazu in einem späteren Kapitel.

Default-Wert aus anderem Parameter ableiten

Parameter werden von vorne nach hinten ausgewertet. Deshalb darf ein späterer Default-Wert auf jeden Parameter zugreifen, der vorher steht:

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

Wird die Funktion mit einem Argument aufgerufen, bekommst du einen Würfel. Mit zwei Argumenten ein quadratisches Prisma. Entscheidend ist dabei die Reihenfolge – du kannst dich nicht auf einen Parameter beziehen, der an dieser Stelle noch gar nicht deklariert wurde:

function bad(a = b, b = 1) {
  return a + b;
}

bad();   // ReferenceError: Cannot access 'b' before initialization

Die gleichen Regeln wie bei Variablen, die mit let deklariert werden: Nutzung vor der Deklaration ist ein Fehler.

Default-Parameter und Destrukturierung kombinieren

Du kannst Parameter destrukturieren und gleichzeitig Standardwerte vergeben. Gerade bei sogenannten "Options-Objekten" als Argument ist das ein typisches Muster:

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

Hier wirken zwei Ebenen von Default-Werten zusammen. Die inneren (role = "member", active = true) setzen fehlende Eigenschaften. Das äußere = {} greift, wenn der Aufrufer gar kein Argument übergibt — ohne das würde createUser() versuchen, undefined zu destrukturieren, und einen Fehler werfen.

Auf den ersten Blick wirkt das Muster dicht gepackt, aber in modernen JavaScript-Codebases begegnet es dir ständig. Sobald dein Auge { ... } = {} als „Optionen mit Default-Werten" erkennt, liest es sich im Handumdrehen.

Mittleres Argument überspringen

JavaScript kennt keine Keyword-Argumente wie Python. Willst du einen mittleren Parameter überspringen und seinen Default-Wert nutzen, musst du explizit undefined übergeben:

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

Wenn du für prefix einfach undefined übergibst, greift wieder der Default-Wert. Schön ist das aber nicht. Sobald du merkst, dass du in Aufrufen ständig undefined mitschleppst, ist das ein klares Zeichen, dass du auf ein Options-Objekt umsteigen solltest:

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

Jetzt gibt die aufrufende Seite explizit an, was überschrieben werden soll – und die Reihenfolge ist dabei egal.

Default-Parameter zählen nicht zu length

Ein Detail am Rande, das selten relevant ist, aber ab und zu für Verwirrung sorgt: Die length-Eigenschaft einer Funktion gibt die Anzahl der Parameter vor dem ersten Parameter mit Default-Wert zurück:

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

Bibliotheken, die Funktionen inspizieren (etwa manche Test- oder DI-Tools), nutzen length, um die "erforderlichen" Parameter zu zählen. Gut zu wissen, dass es diese Regel gibt – auswendig lernen musst du sie aber nur, wenn du selbst solche Tools schreibst.

Weiter geht's: Rest und Spread

Default-Werte helfen dir immer dann, wenn du die Parameter schon im Voraus kennst. Manchmal ist das aber nicht der Fall – du willst, dass eine Funktion beliebig viele Argumente entgegennimmt oder einen ganzen Schwung Argumente an eine andere Funktion weiterreicht. Genau dafür gibt es ...rest und den Spread-Operator. Darum geht's im nächsten Abschnitt.

Häufig gestellte Fragen

Wie setzt man in JavaScript einen Default-Wert für einen Parameter?

Einfach hinter den Parameternamen ein = und den gewünschten Default schreiben: function greet(name = 'friend') { ... }. Ruft jemand die Funktion ohne Wert (oder explizit mit undefined) auf, wird der Default verwendet. Die Syntax gehört zu ES6 und läuft in allen modernen JavaScript-Umgebungen.

Was ist der Unterschied zwischen Parametern und Argumenten?

Parameter sind die Namen in der Funktionsdefinition — bei function add(a, b) sind a und b die Parameter. Argumente sind die konkreten Werte beim Aufruf: add(2, 3) übergibt die Argumente 2 und 3. Den Unterschied zu kennen hilft enorm beim Lesen von Fehlermeldungen und Doku.

Greift der Default-Wert auch, wenn ich null übergebe?

Nein. Defaults springen nur an, wenn das Argument undefined ist (oder komplett fehlt). Wer explizit null übergibt, sagt damit: 'Ich gebe dir einen Wert, und der Wert ist null' — der Default wird übersprungen. Das verwirrt vor allem Leute, die aus Sprachen kommen, in denen null und undefined dasselbe bedeuten.

Kann ein Default-Wert auf einen anderen Parameter zugreifen?

Ja. Parameter werden von links nach rechts ausgewertet, deshalb darf ein späterer Default auf vorherige zugreifen: function box(width, height = width). Auch Funktionsaufrufe sind im Default erlaubt — zum Beispiel function log(msg, time = Date.now()) — und der Ausdruck wird bei jedem Aufruf neu ausgeführt.

Lerne mit Coddy zu programmieren

LOS GEHT'S