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

TypedArray.prototype[Symbol.iterator]()

Methode

Gibt einen Array-Iterator über die Werte eines typisierten Arrays zurück und macht es so iterierbar für <code>for...of</code>, Spread-Syntax und Co.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.prototype[Symbol.iterator]()

Beschreibung

Die Methode [Symbol.iterator]() von TypedArray-Instanzen (z. B. Uint8Array, Float32Array, BigInt64Array) implementiert das Iterable-Protokoll. Dadurch lassen sich typisierte Arrays überall dort verwenden, wo JavaScript ein Iterable erwartet: in for...of-Schleifen, bei der Spread-Syntax ([...ta]), bei der Destrukturierung, in Array.from(), new Set(), new Map(), Promise.all() oder yield*.

Der Anfangswert dieser Eigenschaft ist dasselbe Funktionsobjekt wie TypedArray.prototype.values. Der Iterator liefert also nacheinander die Elementwerte (nicht die Indizes) als number bzw. bei BigInt64Array/BigUint64Array als bigint.

Direkt aufgerufen wird die Methode selten – meist nutzt man sie implizit über die Sprachsyntax. Ein expliziter Aufruf ist sinnvoll, wenn man den Iterator manuell mit next() steuern möchte, etwa beim schrittweisen Parsen eines Byte-Puffers.

Der Iterator ist live: Er liest bei jedem next()-Aufruf den aktuellen Wert am jeweiligen Index. Änderungen am Array während der Iteration werden also sichtbar.

Rückgabewert

Typ
ArrayIterator (Iterator<number | bigint>)
Beschreibung
Ein neues Array-Iterator-Objekt, das bei jedem next()-Aufruf { value, done } liefert – value ist der Elementwert des typisierten Arrays.

Beispiele

Iteration mit for...of

const pixel = new Uint8Array([255, 128, 0, 255]);

for (const kanal of pixel) {
  console.log(kanal);
}
255 128 0 255

Iterator manuell steuern: Header aus Byte-Puffer lesen

const bytes = new Uint8Array([0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a]);
const it = bytes[Symbol.iterator]();

// Erstes Byte überspringen (Magic Byte)
it.next();

const signatur = String.fromCharCode(
  it.next().value,
  it.next().value,
  it.next().value
);
console.log(signatur);
console.log(it.next()); // nächstes Byte
PNG { value: 13, done: false }

Spread, Destrukturierung und Set

const messwerte = new Float32Array([1.5, 2.5, 2.5, 4]);

const [erster, zweiter, ...rest] = messwerte;
console.log(erster, zweiter, rest);

// Eindeutige Werte über Set (nutzt den Iterator)
console.log([...new Set(messwerte)]);

// Gleiche Funktion wie values()
console.log(messwerte[Symbol.iterator] === messwerte.values);
1.5 2.5 [ 2.5, 4 ] [ 1.5, 2.5, 4 ] true

BigInt64Array liefert bigint-Werte

const ids = new BigInt64Array([10n, 20n, 30n]);
const summe = [...ids].reduce((a, b) => a + b, 0n);
console.log(summe);
60n

// Wichtig · Fallstricke

  • Werte, keine Indizes: Der Iterator liefert Elementwerte. Für Index/Wert-Paare entries(), für Indizes keys() verwenden.
  • Spread erzeugt normales Array: [...ta] ergibt ein gewöhnliches Array – bei großen Puffern speicher- und zeitintensiv. Für eine typisierte Kopie besser ta.slice() oder new Uint8Array(ta).
  • Abgelöster Puffer: Wird der zugrunde liegende ArrayBuffer (z. B. per postMessage-Transfer oder ArrayBuffer.prototype.transfer()) abgelöst, wirft der Aufruf einen TypeError; ein laufender Iterator meldet danach done: true bzw. wirft.
  • Live-Verhalten: Änderungen während der Iteration sind sichtbar; bei längenverfolgenden Views auf resizable Buffers kann sich auch die Länge ändern.
  • Performance: In Hot-Paths ist eine klassische for-Schleife mit Index oft schneller als for...of.
  • Kompatibilität: Baseline seit ES2015, in allen modernen Browsern und Node.js unterstützt; nicht im Internet Explorer.