Signatur
Beschreibung
arguments.length enthält die Anzahl der Argumente, die beim tatsächlichen Aufruf an eine (nicht-Pfeil-)Funktion übergeben wurden. Das kann mehr oder weniger sein als die Zahl der deklarierten Parameter. Im Gegensatz dazu liefert Function.prototype.length die Anzahl der deklarierten Parameter (ohne Rest-Parameter und ohne Parameter nach dem ersten mit Standardwert).
Typische Einsatzgebiete sind variadische Funktionen in älterem Code, das Prüfen, ob ein optionales Argument überhaupt übergeben wurde (auch wenn es explizit undefined ist), sowie einfache Überladungen nach Argumentanzahl.
Die Eigenschaft ist beschreibbar, konfigurierbar und nicht aufzählbar. Ein Überschreiben ändert nur den Wert der Eigenschaft, nicht die tatsächlich übergebenen Argumente. In modernem Code sind Rest-Parameter (...args) meist die bessere Wahl: args.length leistet dasselbe, und args ist ein echtes Array.
Rückgabewert
undefined-Werte eingeschlossen.Beispiele
Übergebene vs. deklarierte Argumente
function info(a, b, c) {
console.log(`Übergeben: ${arguments.length}, deklariert: ${info.length}`);
}
info(1);
info(1, 2, 3, 4);
info(undefined, undefined);
Variadische Summe (klassisch und mit Rest-Parametern)
function summe() {
let total = 0;
for (let i = 0; i < arguments.length; i++) {
total += arguments[i];
}
return total;
}
// Moderne Alternative
const summeModern = (...zahlen) => zahlen.reduce((acc, n) => acc + n, 0);
console.log(summe(1, 2, 3, 4));
console.log(summeModern(1, 2, 3, 4));
Unterscheiden: Argument fehlt oder ist undefined
function setzeWert(obj, schluessel, wert) {
if (arguments.length < 3) {
throw new TypeError('setzeWert erwartet 3 Argumente');
}
obj[schluessel] = wert; // undefined ist hier ein gültiger Wert
return obj;
}
console.log(setzeWert({}, 'x', undefined));
try {
setzeWert({}, 'x');
} catch (e) {
console.log(e.message);
}
// Wichtig · Fallstricke
- Pfeilfunktionen haben kein eigenes
arguments-Objekt. Dort verweistargumentsauf das der umgebenden Funktion, oder es kommt zu einemReferenceError(z. B. auf Modulebene). Nutze stattdessen Rest-Parameter. - Nicht verwechseln mit
Function.prototype.length:fn.lengthzählt die deklarierten Parameter,arguments.lengthdie tatsächlich übergebenen. - Die Eigenschaft ist beschreibbar:
arguments.length = 0ändert nur den Zähler, nicht die Einträge. Methoden, die sich auflengthstützen (z. B.Array.from(arguments)), liefern danach aber abweichende Ergebnisse. - Standardwerte zählen nicht mit: Bei
function f(a = 1) {}liefertf()fürarguments.lengthden Wert0. - Die Verwendung von
argumentskann in manchen Engines Optimierungen erschweren. In performancekritischem Code sind Rest-Parameter vorzuziehen.