Default parameters

Standard Funktionsparameter erlaubt es formale Parameter mit vorgegebenen Werten zu initialisieren, wenn beim Funktionsaufruf kein Wert oder undefined ├╝bergeben wird.

Syntax

function [name]([param1[ = defaultValue1 ][, ..., paramN[ = defaultValueN ]]]) {
   statements
}

Beschreibung

In JavaScript haben Funktionsparameter standardm├Ą├čig den Default-Wert undefined. Manchmal ist es jedoch sinnvoll einen anderen Default-Wert zu setzen. Hier helfen Default-Parameter weiter.

In der Vergangenheit war die allgemeine Strategie f├╝r das Setzen von Default-Werten das Testen von Parameterwerten im Body der Funktion und dem Zuordnen eines Default-Wertes, wenn dieser undefined ist. Wenn in dem folgenden Beispiel bei dem Aufruf kein Wert f├╝r b mitgegeben wird, w├╝rde der Wert undefined sein. Bei der Auswertung von a*b und dem Aufruf von multiply wird als R├╝ckgabewert NaN zur├╝ckgegeben. Im Beispiel wird deshalb dieser R├╝ckgabewert in der zweiten Zeile der Funktion aufgefangen:

function multiply(a, b) {
  b = (typeof b !== 'undefined') ?  b : 1;
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5

Mit dem Default-Parameter in ES2015 ist die Pr├╝fung im Funktionsk├Ârper nicht mehr n├Âtig. Jetzt kann man einfach 1 als den Standardwert f├╝r b in dem Funktionskopf definieren: 

function multiply(a, b = 1) {
  return a * b;
}

multiply(5, 2); // 10
multiply(5, 1); // 5
multiply(5);    // 5

Beispiele

├ťbergeben von undefined und anderen falsy Werten

In dem zweiten Aufruf, auch wenn das erste Argument explizit auf undefined gesetzt ist (jedoch nicht null oder andere Falsy-Werte, ist der Wert des Arguments num beim Aufruf der Default-Wert.

function test(num = 1) {
  console.log(typeof num);
}

test();          // 'number' (num wird auf 1 gesetzt)
test(undefined); // 'number' (num wird auf 1 gesetzt)

// test with other falsy values:
test('');        // 'string' (num wird auf '' gesetzt)
test(null);      // 'object' (num wird auf null gesetzt)

Auswerten beim Aufruf

Das Standard-Argument wird zum Zeitpunkt des Aufrufs ausgewertet. Somit wird - anders als z.B. in Python - ein neues Objekt bei jedem Funktionsaufruf erzeugt.

function append(value, array = []) {
  array.push(value);
  return array;
}

append(1); //[1]
append(2); //[2], nicht [1, 2]

Das Gleiche gilt f├╝r Funktionen und Variablen:

function callSomething(thing = something()) {
 return thing;
}

function something(){
  return "sth";
}

callSomething();  //sth

Default-Parameter stehen nachfolgenden Default-Parametern zur Verf├╝gung

Die bereits angetroffenen Parameter stehen den sp├Ąteren Standardparametern zur Verf├╝gung:

function singularAutoPlural(singular, plural = singular+"s",
                            rallyingCry = plural + " ATTACK!!!") {
  return [singular, plural, rallyingCry ];
}

//["Gecko","Geckos", "Geckos ATTACK!!!"]
singularAutoPlural("Gecko");

//["Fox","Foxes", "Foxes ATTACK!!!"]
singularAutoPlural("Fox","Foxes");

//["Deer", "Deer", "Deer ... change."]
singularAutoPlural("Deer", "Deer", "Deer peaceably and respectfully
   petition the government for positive change.")

Diese Funktionalit├Ąt wird in einer geradlinigen Weise angen├Ąhert und zeigt, wie viele Randf├Ąlle behandelt werden:

function go() {
  return ":P"
}

function withDefaults(a, b = 5, c = b, d = go(), e = this,
                      f = arguments, g = this.value) {
  return [a,b,c,d,e,f,g];
}

function withoutDefaults(a, b, c, d, e, f, g){
  switch(arguments.length){
    case 0:
      a
    case 1:
      b = 5
    case 2:
      c = b
    case 3:
      d = go();
    case 4:
      e = this
    case 5:
      f = arguments
    case 6:
      g = this.value;
    default:
  }
  return [a,b,c,d,e,f,g];
}

withDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]


withoutDefaults.call({value:"=^_^="});
// [undefined, 5, 5, ":P", {value:"=^_^="}, arguments, "=^_^="]

Funktionen definiert innerhalb des Funktionsk├Ârpers

Eingef├╝hrt in Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30). Funktionen die innerhalb eines Funktionsk├Ârper deklariert werden, k├Ânnen nicht von Default-Parametern referenziert werden und f├╝hren zu einem ReferenceError (aktuell wird ein TypeError erzeugt, siehe Bug 1022967). Default-Parameter werden stets zuerst ausgewertet, Funktionsdeklarationen innerhalb von Funktionsk├Ârpern erst hinterher.

// Funktioniert nicht! Wirft einen ReferenceError.
function f(a = go()) {
  function go(){return ":P"}
}

Paramater ohne Default nach Default-Parameter

Vor Gecko 26 (Firefox 26 / Thunderbird 26 / SeaMonkey 2.23 / Firefox OS 1.2) erzeugte der folgende Code einen SyntaxError. Dieses wurde in Bug 777060 behoben und funktioniert wie erwartet in sp├Ąteren Versionen. Bei Aufruf werden Parameter noch immer von links nach rechts angegeben. Default-Parameter werden ├╝berschrieben, auch wenn sp├Ątere Parameter keinen Default haben:

function f(x=1, y) {
  return [x, y];
}

f(); // [1, undefined]
f(2); // [2, undefined]

Zerst├Ârter Parameter mit Standardwertzuordnung

Sie k├Ânnen die Standardwertzuordnung mit der destrukturierende Zuordnung Schreibweise verwenden:

function f([x, y] = [1, 2], {z: z} = {z: 3}) {
  return x + y + z;
}

f(); // 6

Spezifikationen

Browserkompatibilit├Ąt

BCD tables only load in the browser

Wir konvertieren die Kompatibilit├Ątsdaten in ein maschinenlesbares JSON Format. Diese Kompatibilit├Ątstabelle liegt noch im alten Format vor, denn die darin enthaltenen Daten wurden noch nicht konvertiert. Finde heraus wie du helfen kannst!

Siehe auch