Signatur
Beschreibung
Die Methode entries() ist auf allen typisierten Arrays verfügbar, etwa Uint8Array, Int32Array, Float64Array oder BigInt64Array. Sie gibt ein neues Array-Iterator-Objekt zurück. Dieses liefert nacheinander zweielementige Arrays der Form [index, wert]. Der Algorithmus ist derselbe wie bei Array.prototype.entries().
Am häufigsten nutzt man sie zusammen mit for...of und Destrukturierung: So hat man in einer Schleife gleichzeitig Zugriff auf Index und Wert, ohne einen Zähler von Hand zu führen. Das ist praktisch, wenn man Binärdaten (Pixelpuffer, Audio-Samples, Netzwerkpakete) nach bestimmten Positionen durchsucht oder Werte mit ihrer Position protokolliert.
Der Iterator wird verzögert ausgewertet: Er liest die Werte erst beim Aufruf von next() aus dem zugrunde liegenden ArrayBuffer. Änderungen am Array während der Iteration sind daher sichtbar. Der Iterator ist außerdem nur einmal verwendbar. Ist er erschöpft, braucht man für einen neuen Durchlauf einen neuen Aufruf von entries().
Rückgabewert
[index, wert]. Bei BigInt64Array und BigUint64Array ist der Wert ein bigint.Beispiele
Index und Wert mit for...of durchlaufen
const samples = new Float32Array([0.5, -0.25, 1, 0]);
for (const [index, value] of samples.entries()) {
console.log(`Sample ${index}: ${value}`);
}
Iterator manuell mit next() abfragen
const bytes = new Uint8Array([10, 20]);
const it = bytes.entries();
console.log(it.next()); // erstes Paar
console.log(it.next()); // zweites Paar
console.log(it.next()); // erschöpft
Positionen übersteuerter Pixelwerte finden
const pixels = new Uint8ClampedArray([12, 255, 80, 255, 0, 200]);
// Alle Indizes mit Maximalwert 255 sammeln
const clipped = [...pixels.entries()]
.filter(([, value]) => value === 255)
.map(([index]) => index);
console.log(clipped);
In eine Map umwandeln
const ids = new Int16Array([-3, 7, 42]);
const map = new Map(ids.entries());
console.log(map.get(2));
console.log(map.size);
// Wichtig · Fallstricke
- Einmal verwendbar: Ein Iterator ist nach einem Durchlauf erschöpft. Wird er ein zweites Mal in
for...ofoder mit Spread verwendet, entstehen keine Werte mehr. Für jeden Durchlaufentries()neu aufrufen. - Verzögertes Lesen: Werte werden erst bei
next()gelesen. Schreibt man während der Iteration in das Array, sieht der Iterator die neuen Werte. - Abgelöste Puffer: Wird der zugrunde liegende
ArrayBufferabgelöst (z. B. perpostMessagemit Transfer oderArrayBuffer.prototype.transfer()), wirft der Aufruf vonentries()einenTypeError. Wird der Puffer erst während der Iteration abgelöst, wirft auch das nächstenext()einenTypeError. - Performance: Für jedes Element wird ein neues Array
[index, wert]erzeugt. In rechenintensiven Schleifen über große Puffer ist eine klassischefor-Schleife mit Index deutlich schneller. - BigInt-Arrays: Bei
BigInt64ArrayundBigUint64Arraysind die Werte vom Typbigintund lassen sich nicht direkt mitnumbermischen. - Unterstützt von allen modernen Browsern und Node.js seit ES2015 (Baseline).