Start · Sprachen · JavaScript · Referenz · arguments[Symbol.iterator]()

arguments[Symbol.iterator]()

Methode

Gibt einen Array-Iterator über die Werte des <code>arguments</code>-Objekts zurück und macht es so für <code>for...of</code>, Spread-Syntax und <code>Array.from()</code> nutzbar.

seit JavaScript ES2015 Kategorie: method-property

Signatur

arguments[Symbol.iterator]()

Beschreibung

Die Methode arguments[Symbol.iterator]() implementiert das iterierbare Protokoll für das arguments-Objekt. Deshalb kann arguments überall verwendet werden, wo ein Iterable erwartet wird: in for...of-Schleifen, in der Spread-Syntax ([...arguments]), in Array.from(), bei der Array-Destrukturierung oder als Eingabe für new Set() und Promise.all().

Der Anfangswert dieser Eigenschaft ist dasselbe Funktionsobjekt wie Array.prototype.values. Es wird also ein Array-Iterator erzeugt, der die Werte der Indizes 0 bis arguments.length - 1 der Reihe nach liefert. Die Eigenschaft ist beschreibbar und konfigurierbar, aber nicht aufzählbar.

In der Praxis ruft man die Methode selten direkt auf – die Sprache erledigt das implizit. Wichtig ist sie vor allem für älteren Code oder Funktionen, die bewusst mit variabler Argumentzahl arbeiten, ohne Rest-Parameter (...args) zu verwenden. In modernem Code sind Rest-Parameter meist die bessere Wahl, da sie ein echtes Array liefern.

Rückgabewert

Typ
Array Iterator
Beschreibung
Ein neues Array-Iterator-Objekt, das die Werte jedes Index im arguments-Objekt nacheinander liefert ({ value, done }).

Beispiele

Iteration mit for...of

function summe() {
  let gesamt = 0;
  // for...of ruft intern arguments[Symbol.iterator]() auf
  for (const zahl of arguments) {
    gesamt += zahl;
  }
  return gesamt;
}

console.log(summe(1, 2, 3, 4));
10

Iterator manuell verwenden

function zeigeArgumente() {
  const iterator = arguments[Symbol.iterator]();
  console.log(iterator.next());
  console.log(iterator.next());
  console.log(iterator.next());
}

zeigeArgumente('a', 'b');
{ value: 'a', done: false } { value: 'b', done: false } { value: undefined, done: true }

arguments per Spread in ein echtes Array umwandeln

function eindeutigeTags() {
  // Spread und Set nutzen beide das iterierbare Protokoll
  const tags = [...new Set(arguments)];
  return tags.map((t) => t.toLowerCase()).sort();
}

console.log(eindeutigeTags('JS', 'Web', 'JS', 'DOM'));
[ 'dom', 'js', 'web' ]

Identität mit Array.prototype.values

function pruefen() {
  return arguments[Symbol.iterator] === Array.prototype.values;
}

console.log(pruefen());
true

// Wichtig · Fallstricke

  • Arrow-Funktionen besitzen kein eigenes arguments. Innerhalb einer Arrow-Funktion verweist arguments auf das der umgebenden regulären Funktion – auf oberster Modulebene führt der Zugriff zu einem ReferenceError.
  • arguments ist trotz Iterierbarkeit kein Array: Methoden wie map() oder filter() fehlen. Mit Array.from(arguments) oder [...arguments] erhält man ein echtes Array.
  • Der Iterator ist live: Änderungen an arguments (oder im nicht-strikten Modus an den verknüpften Parametern) während der Iteration wirken sich auf die gelieferten Werte aus.
  • Da die Eigenschaft beschreibbar ist, kann sie überschrieben oder gelöscht werden – danach schlagen for...of und Spread mit einem TypeError fehl.
  • Moderne Alternative: Rest-Parameter (function f(...args)) liefern direkt ein Array und sind lesbarer sowie besser optimierbar.
  • Kompatibilität: ES2015, in allen modernen Browsern und Node.js unterstützt; im Internet Explorer nicht verfügbar.