Signatur
Beschreibung
Die Methode values() gibt es auf allen typisierten Arrays, also etwa Uint8Array, Int16Array, Float32Array oder BigInt64Array. Sie liefert ein Array-Iterator-Objekt, das die Elementwerte in Index-Reihenfolge zurückgibt. Sie verhält sich genau wie Array.prototype.values().
TypedArray.prototype.values ist dieselbe Funktion wie TypedArray.prototype[Symbol.iterator]. Deshalb nutzen for...of, der Spread-Operator ([...ta]), Array.from() und die Destrukturierung intern genau diesen Iterator. Einen expliziten Aufruf von values() braucht man vor allem, wenn man den Iterator manuell mit next() steuern oder an eine Funktion weitergeben will, die ein Iterator-Objekt erwartet.
Der Iterator ist lazy (bedarfsgesteuert): Er liest jeden Wert erst beim Aufruf von next() aus dem zugrunde liegenden Speicher. Ändert man das Array während der Iteration, sieht der Iterator diese Änderungen. Ist der Iterator einmal am Ende angekommen, kann man ihn nicht zurücksetzen. Für einen neuen Durchlauf ruft man values() erneut auf.
Rückgabewert
next() liefert { value, done }. Bei BigInt64Array und BigUint64Array sind die Werte vom Typ bigint, sonst vom Typ number.Beispiele
Werte mit for...of durchlaufen
const pixel = new Uint8Array([255, 128, 0, 255]);
for (const channel of pixel.values()) {
console.log(channel);
}
Iterator manuell mit next() steuern
const samples = new Float32Array([0.5, -0.25, 1]);
const it = samples.values();
console.log(it.next()); // erster Wert
console.log(it.next());
console.log(it.next());
console.log(it.next()); // Ende erreicht
Summe über einen Datenpuffer berechnen
const buffer = new ArrayBuffer(8);
const view = new Int16Array(buffer);
view.set([100, -20, 300, 5]);
const sum = (iterable) => {
let total = 0;
for (const v of iterable) total += v;
return total;
};
console.log(sum(view.values()));
Iterator ist nach einem Durchlauf erschöpft
const bytes = new Uint8Array([1, 2, 3]);
const it = bytes.values();
console.log([...it]); // erster Durchlauf
console.log([...it]); // leer – Iterator verbraucht
console.log([...bytes.values()]); // neuer Iterator
// Wichtig · Fallstricke
- Einmal verbraucht: Ein Iterator lässt sich nur ein einziges Mal durchlaufen. Soll mehrfach iteriert werden, entweder
values()erneut aufrufen oder direkt das typisierte Array selbst iterieren. - Änderungen während der Iteration: Der Iterator liest die Werte live aus dem Speicher. Werden Elemente während des Durchlaufs geändert, erscheinen die neuen Werte.
- Abgelöster oder verkleinerter Puffer: Wird der zugrunde liegende
ArrayBufferabgelöst (z. B. durchpostMessagemit Transfer oder durchArrayBuffer.prototype.transfer()), wirft ein weiterer Aufruf vonnext()einenTypeError. Bei in der Größe veränderbaren Puffern endet die Iteration früher, wenn der Puffer schrumpft. - Typen:
BigInt64ArrayundBigUint64Arrayliefernbigint-Werte. Diese lassen sich nicht ohne Weiteres mitnumber-Werten verrechnen. - Performance: In sehr heißen Schleifen ist eine klassische
for-Schleife mit Indexzugriff oft etwas schneller als der Umweg über einen Iterator. - Kompatibilität: Wird von allen modernen Browsern und von Node.js unterstützt. Der Internet Explorer unterstützt die Methode nicht.