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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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:
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.