Start · Sprachen · JavaScript · Referenz · TypedArray.prototype.keys()

TypedArray.prototype.keys()

Methode

Gibt ein neues Array-Iterator-Objekt zurück, das nacheinander die Indizes (<code>0</code> bis <code>length - 1</code>) eines typisierten Arrays liefert.

seit JavaScript ES2015 Kategorie: method-property

Signatur

TypedArray.prototype.keys()

Beschreibung

keys() liefert einen Array Iterator, der beim Durchlaufen jeden gültigen Index des typisierten Arrays als Zahl ausgibt, also 0, 1, 2, …, length - 1. Die Methode funktioniert genauso wie Array.prototype.keys(), arbeitet aber auf Instanzen wie Uint8Array, Float32Array oder BigInt64Array.

Nützlich ist sie überall dort, wo du nur die Position brauchst und nicht den Wert selbst, etwa um Indizes für Berechnungen zu erzeugen, um parallel zwei Puffer gleicher Länge zu durchlaufen oder um mit Array.from() eine Indexliste zu bauen. Brauchst du Index und Wert zusammen, ist entries() meist die bessere Wahl.

Der Iterator ist lazy: Er liest die aktuelle Länge des typisierten Arrays erst bei jedem Aufruf von next(). Da typisierte Arrays keine Lücken haben, werden anders als bei Object.keys() immer alle Indizes geliefert. Die Werte sind echte Zahlen (number), keine Strings.

Rückgabewert

Typ
ArrayIterator<number>
Beschreibung
Ein neues, iterierbares Array Iterator-Objekt, das die Indizes des typisierten Arrays als number liefert.

Beispiele

Indizes mit for...of durchlaufen

const pixels = new Uint8Array([10, 20, 30]);

for (const index of pixels.keys()) {
  console.log(index);
}
0 1 2

Iterator manuell mit next() abfragen

const samples = new Float32Array([0.5, 1.5]);
const it = samples.keys();

console.log(it.next()); // erster Index
console.log(it.next()); // zweiter Index
console.log(it.next()); // fertig
{ value: 0, done: false } { value: 1, done: false } { value: undefined, done: true }

Zwei Puffer indexbasiert verrechnen (Audio-Mix)

const left = new Float32Array([0.2, 0.4, 0.6]);
const right = new Float32Array([0.8, 0.6, 0.4]);
const mono = new Float32Array(left.length);

for (const i of left.keys()) {
  mono[i] = (left[i] + right[i]) / 2;
}

console.log(Array.from(mono));
[0.5, 0.5, 0.5]

Indizes gerader Werte ermitteln

const data = new Int16Array([3, 8, 5, 12, 7]);

const evenIndices = [...data.keys()].filter((i) => data[i] % 2 === 0);
console.log(evenIndices);
[1, 3]

// Wichtig · Fallstricke

  • Einmal verbraucht: Ein Iterator lässt sich nur einmal durchlaufen. Für einen zweiten Durchlauf rufst du keys() erneut auf.
  • Lazy-Auswertung: Wird ein längenabhängiges typisiertes Array auf einem veränderbaren ArrayBuffer (ES2024, resize()) während der Iteration verkleinert, endet der Iterator früher. Wird der Puffer abgekoppelt (transfer() bzw. postMessage mit Transfer), wirft der nächste Aufruf von next() einen TypeError.
  • Rufst du keys() auf einem Objekt auf, das kein typisiertes Array ist (z. B. über call()), wird ein TypeError geworfen.
  • Performance: In performancekritischen Schleifen ist eine klassische for (let i = 0; i < arr.length; i++)-Schleife oft schneller als der Iterator.
  • Kompatibilität: in allen modernen Browsern und Node.js unterstützt (Baseline), nicht im Internet Explorer.