Standardwerte
Kurz gesagt: Der Standardwert eines Parameters wird verwendet, wenn das Argument nicht übergeben wird, und ...rest sammelt beliebig viele Argumente in einem Array.
Problem
Zwei Artikel, drei Artikel
Die Kasse muss die Preise der Artikel addieren. Manchmal sind es zwei, manchmal drei. Die Funktion meint in beiden Fällen dasselbe: „addieren“. In Java und C# macht man das mit zwei Methoden, die einen Namen und unterschiedlich viele Parameter haben. Du versuchst dasselbe:
function total(a, b) { return a + b;}
function total(a, b, c) { return a + b + c;}
console.log(total(2.5, 4.0, 1.5));console.log(total(2.5, 4.0));8NaNMit drei Argumenten funktioniert es. Mit zweien bricht das Programm nicht ab, sondern gibt NaN aus („not a number“, keine Zahl). Auch mit zwei Argumenten wird also die Funktion mit drei Parametern aufgerufen. Wo ist die erste geblieben?
Die Idee
Ein Name, eine Funktion
In JavaScript wird jede function unter ihrem Namen gespeichert, bevor die erste Zeile läuft. Heißen zwei gleich, ersetzt die zweite die erste, ebenfalls noch vor der ersten Zeile. Deshalb landet schon der erste Aufruf bei der zweiten Funktion.
Deshalb kennt JavaScript kein Überladen: zwei Funktionen mit einem Namen, die sich in ihren Parametern unterscheiden, wie in Java und C#. Stattdessen kann eine Funktion unterschiedlich viele Argumente nehmen. Wie, siehst du auf den nächsten Karten.
function printHeader() { console.log("Eckladen");}
printHeader();
function printHeader() { console.log("Laden am Markt");}
printHeader();Schritt für Schritt, in Worten
- Bevor es auch nur eine Zeile ausführt, speichert JavaScript jede Funktion. Der Name printHeader zeigt auf die erste.
- Immer noch vor der ersten Zeile: die zweite Funktion mit demselben Namen. Der Name zeigt jetzt auf sie, und die erste ist weg.
- Erst jetzt läuft die erste Zeile. Der Aufruf landet bei der zweiten Funktion: „Laden am Markt“.
- Der zweite Aufruf: wieder „Laden am Markt“.
- Es gibt einen Namen, und die letzte Funktion gewinnt. Deshalb gibt schon der erste Aufruf den neuen Namen aus.
Genauer, für Neugierige
Hat die Datei ein import (wie die Programme, die von der Tastatur lesen), führt Node.js sie als Modul aus. Dort sind zwei functions mit einem Namen ein Fehler, und das Programm startet nicht:
SyntaxError: Identifier 'total' has already been declaredDas ist besser: Du siehst den Fehler sofort, statt dass still eine andere Funktion aufgerufen wird.
Probier es aus
Welche Funktion?
Was gibt das Programm aus?
function describe(x) { console.log(`ganz: ${x}`);}
function describe(x) { console.log(`dezimal: ${x}`);}
describe(5);describe(5.0);describe hat das erste ersetzt, also landen beide Aufrufe bei „dezimal“. Und 5.0 ist in JavaScript einfach 5: Ganze Zahlen und Dezimalzahlen sind ein Typ, number.Die Idee
Ein Standardwert
Eine Funktion reicht für zwei und für drei Artikel. Gib dem dritten Parameter einen Standardwert: Er wird verwendet, wenn das Argument nicht übergeben wird.
function total(a, b, c = 0) { return a + b + c;}
console.log(total(2.5, 4.0));console.log(total(2.5, 4.0, 1.5));6.58c = 0 bedeutet: Hat der Aufruf nur zwei Argumente, ist c gleich 0. Hat er drei, ist c das dritte.
Parameter mit Standardwert schreibt man nach denen ohne. Argumente werden den Parametern nach Position zugeordnet, also stehen die optionalen am Ende.
Genauer, für Neugierige
Der Standardwert wird bei jedem Aufruf berechnet, bei dem das Argument fehlt. Deshalb ist ein Standard-Array jedes Mal ein neues:
function addItem(item, cart = []) { cart.push(item); return cart;}
console.log(addItem("Brot"));console.log(addItem("Milch"));[ 'Brot' ][ 'Milch' ]Probier es aus
Finde den Fehler
Wähle die Zeile mit dem Fehler.
nights = 1) steht vor dem Parameter ohne (name). JavaScript erlaubt das, aber Argumente werden nach Position zugeordnet: "Maria" landet in nights, und name bleibt undefined. Die Korrektur ist function book(name, nights = 1).Die Idee
Wie man einen Parameter überspringt
Ein Hotel nimmt Buchungen an. Eine Nacht ohne Frühstück ist am häufigsten, also sind beide Standardwerte:
function book(name, nights = 1, breakfast = false) { console.log(`${name}, Nächte: ${nights}`); if (breakfast) { console.log(" mit Frühstück"); }}
book("Maria");book("Jonas", 3);book("Lena", undefined, true);Maria, Nächte: 1Jonas, Nächte: 3Lena, Nächte: 1 mit FrühstückLena möchte Frühstück, aber nur eine Nacht. JavaScript hat keine Schlüsselwortargumente: Argumente gehen nur nach Position in die Parameter. Um den dritten zu erreichen, übergibst du an der Stelle des zweiten undefined. Nur undefined löst den Standardwert aus. null nicht:
book("Lena", null);Lena, Nächte: nullGenauer, für Neugierige
Gibt es viele optionale Parameter, übergibt JavaScript-Code meist ein Objekt mit Namen: { breakfast: true }. In der Funktion nimmt { nights = 1, breakfast = false } = {} jeden Wert über seinen Namen, mit Standardwert. Objekte schauen wir uns im Modul „Klassen und Objekte“ an, aber das Muster ist so verbreitet, dass du es erkennen solltest:
function book(name, { nights = 1, breakfast = false } = {}) { console.log(`${name}, Nächte: ${nights}`); if (breakfast) { console.log(" mit Frühstück"); }}
book("Maria");book("Lena", { breakfast: true });book("Felix", { nights: 2 });Maria, Nächte: 1Lena, Nächte: 1 mit FrühstückFelix, Nächte: 2Die Idee
Beliebig viele Argumente
Und wenn es fünf Artikel sind? Zwanzig? Du schreibst nicht für jeden einen Parameter. Du sagst, dass die Funktion beliebig viele Argumente nimmt:
function total(...prices) { let result = 0; for (const p of prices) { result += p; } return result;}
console.log(total(1.5, 2.0, 3.5, 4.0));console.log(total(9.99));console.log(total());119.990Die drei Punkte vor dem Namen (...prices) bedeuten: „Übergib so viele Werte, wie du willst.“ In der Funktion kommen sie als Array an, das auch leer sein kann. Das nennt man einen Rest-Parameter.
function show(...prices) { console.log(prices);}
show(1.5, 2.0);[ 1.5, 2 ]Deshalb gibt auch console.log so viele Werte aus, wie du ihm gibst: Es ist eine Funktion, die beliebig viele Argumente nimmt.
console.log("Brot", "Milch", "Kaffee");console.log(Math.max(3, 8, 2));Brot Milch Kaffee8Genauer, für Neugierige
- Es kann nur einen solchen Parameter geben, und er muss der letzte sein:
function receipt(title, ...prices).
Probier es aus
Was fehlt?
function total(prices) {
let result = 0;
for (const p of prices) {
result += p;
}
return result;
}...prices: Die drei Punkte vor dem Namen sammeln alle Argumente in einem Array.Übung
Eine Funktion statt mehrerer
1. Die größte. Schreib eine Funktion, largest(...numbers), die die größte von beliebig vielen Zahlen zurückgibt.
largest(3, 8)largest(4, 9, 2)largest(2.5, 1.5)892.52. Notendurchschnitt. Die Funktion average(...grades) gibt den Durchschnitt beliebig vieler Noten zurück, und ohne Noten gibt sie 0 zurück.
average(5, 6, 4)average(6, 5)average()55.503. Eine Zeile auf dem Bon. printLine(item, qty) gibt „Kaffee x 2“ aus. Mach die Menge optional: Ohne sie ist sie 1.
printLine("Kaffee", 2)printLine("Croissant")Kaffee x 2Croissant x 14. Kostenlose Lieferung. shippingCost(total, freeFrom = 50) gibt 0 zurück, wenn die Bestellung mindestens die Schwelle erreicht, sonst 4,99 €. Die Schwelle ist 50 €, außer es wird eine andere übergeben.
shippingCost(62.0)shippingCost(30.0)shippingCost(30.0, 25)04.990Test
Teste dich
Verwandte Lektionen
Abschnitt „Verwandte Lektionen“- Baut auf: Schleifen · Arrays · Funktionen · Parameter und return
- Geht weiter in: Builder · Decorator · Composite · Funktionen: eine Aufgabe, wenige Parameter, keine versteckten Seiteneffekte
- Aufgaben zum Thema: Funktionen