Signatur
Beschreibung
arguments ist eine lokale Variable, die in jeder mit function definierten Funktion automatisch zur Verfügung steht. Sie enthält alle tatsächlich übergebenen Argumente, auch solche, für die kein benannter Parameter existiert. Den Zugriff gibt es über den Index (arguments[0]), die Anzahl über arguments.length.
Das Objekt ist array-ähnlich, aber kein echtes Array: Es hat length und numerische Indizes, aber keine Array-Methoden wie map, filter oder forEach. Man kann es mit Array.from(arguments) oder [...arguments] umwandeln. Seit ES2015 ist es iterierbar und funktioniert daher mit for...of und dem Spread-Operator.
In modernem Code ersetzt man arguments meist durch Rest-Parameter (...args). Die liefern ein echtes Array, sind im Funktionskopf sichtbar und funktionieren auch in Pfeilfunktionen. Nützlich bleibt arguments vor allem in älterem Code, beim Weiterreichen aller Argumente in Wrapper-Funktionen ohne Rest-Syntax und wenn man prüfen will, wie viele Argumente wirklich übergeben wurden.
Rückgabewert
0…n-1, der Eigenschaft length, Symbol.iterator sowie (nur im Non-Strict-Modus) arguments.callee.Beispiele
Beliebig viele Argumente summieren
function summe() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
console.log(summe(1, 2, 3));
console.log(summe(10, 20, 30, 40));
console.log(summe());
In ein echtes Array umwandeln
function verbinde(trenner) {
// erstes Argument ist der Trenner, der Rest sind die Teile
const teile = Array.from(arguments).slice(1);
return teile.map((t) => t.toUpperCase()).join(trenner);
}
console.log(verbinde(' | ', 'html', 'css', 'js'));
Übergebene Argumente zählen (optionale Parameter erkennen)
function setzeWert(schluessel, wert) {
if (arguments.length < 2) {
return `Lese ${schluessel}`;
}
// unterscheidet 'nicht übergeben' von explizit undefined
return `Setze ${schluessel} = ${wert}`;
}
console.log(setzeWert('farbe'));
console.log(setzeWert('farbe', undefined));
Moderne Alternative: Rest-Parameter
const log = (level, ...nachrichten) => {
// in Pfeilfunktionen gibt es kein eigenes arguments
console.log(`[${level}]`, nachrichten.join(' '));
};
function wrapper() {
// alle Argumente unverändert weiterreichen
return log(...arguments);
}
wrapper('INFO', 'Server', 'gestartet');
// Wichtig · Fallstricke
- Pfeilfunktionen haben kein eigenes
arguments. Sie greifen auf dasargumentsder umgebenden Funktion zu oder lösen auf oberster Ebene eines Moduls einenReferenceErroraus. Nimm dort Rest-Parameter. - Kein echtes Array:
arguments.map(...)löst einenTypeErroraus. Wandle es vorher mitArray.from()oder[...arguments]um. - Kopplung an Parameter: Im Non-Strict-Modus und nur bei einfachen Parameterlisten sind
arguments[i]und die benannten Parameter miteinander verknüpft. Eine Änderung an einem von beiden ändert auch den anderen. Im Strict-Modus und bei Standardwerten, Rest- oder Destrukturierungs-Parametern gibt es diese Verknüpfung nicht. arguments.calleeist veraltet und löst im Strict-Modus (also auch in Klassen und ES-Modulen) einenTypeErroraus. Nimm stattdessen benannte Funktionsausdrücke.- Im Strict-Modus darf man
argumentsnicht neu zuweisen und nicht als Bezeichner verwenden. - Performance: Wenn man
argumentsnach außen weiterreicht (z. B.return arguments), kann das Optimierungen der Engine verhindern. Rest-Parameter sind hier unproblematisch. arguments.lengthist die Zahl der übergebenen Argumente.fn.lengthdagegen ist die Zahl der deklarierten Parameter.