Signatur
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
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);
}
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
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);
BigInt64Array liefert bigint-Werte
const ids = new BigInt64Array([10n, 20n, 30n]);
const summe = [...ids].reduce((a, b) => a + b, 0n);
console.log(summe);
// Wichtig · Fallstricke
- Werte, keine Indizes: Der Iterator liefert Elementwerte. Für Index/Wert-Paare
entries(), für Indizeskeys()verwenden. - Spread erzeugt normales Array:
[...ta]ergibt ein gewöhnlichesArray– bei großen Puffern speicher- und zeitintensiv. Für eine typisierte Kopie besserta.slice()odernew Uint8Array(ta). - Abgelöster Puffer: Wird der zugrunde liegende
ArrayBuffer(z. B. perpostMessage-Transfer oderArrayBuffer.prototype.transfer()) abgelöst, wirft der Aufruf einenTypeError; ein laufender Iterator meldet danachdone: truebzw. 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 alsfor...of. - Kompatibilität: Baseline seit ES2015, in allen modernen Browsern und Node.js unterstützt; nicht im Internet Explorer.