Signatur
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
number liefert.Beispiele
Indizes mit for...of durchlaufen
const pixels = new Uint8Array([10, 20, 30]);
for (const index of pixels.keys()) {
console.log(index);
}
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
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));
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);
// 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.postMessagemit Transfer), wirft der nächste Aufruf vonnext()einenTypeError. - Rufst du
keys()auf einem Objekt auf, das kein typisiertes Array ist (z. B. übercall()), wird einTypeErrorgeworfen. - 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.