Signatur
Beschreibung
keys() erzeugt einen Array-Iterator, der die Indizes 0 bis length - 1 des Arrays in aufsteigender Reihenfolge liefert. Der Iterator erfüllt das Iterator-Protokoll. Man kann ihn also mit for...of, dem Spread-Operator ..., Array.from() oder Destrukturierung verwenden.
Anders als Object.keys() überspringt Array.prototype.keys() keine leeren Stellen in dünn besetzten Arrays. Jeder Index bis length - 1 wird ausgegeben, auch wenn an dieser Stelle kein Wert steht. Außerdem liefert die Methode Zahlen und keine Strings.
Die Methode ist generisch. Sie liest nur die Eigenschaft length von this und lässt sich deshalb über Array.prototype.keys.call() auch auf array-ähnliche Objekte anwenden. Typische Einsatzfälle sind Zahlenfolgen ([...Array(n).keys()]) und Schleifen, in denen nur der Index gebraucht wird.
Der Iterator wird verzögert ausgewertet: length wird bei jedem next()-Aufruf neu gelesen. Wird das Array während der Iteration länger oder kürzer, wirkt sich das auf die gelieferten Indizes aus.
Rückgabewert
next() den nächsten Index als number liefert, bis { value: undefined, done: true } zurückkommt.Beispiele
Indizes mit for...of durchlaufen
const farben = ['rot', 'grün', 'blau'];
for (const index of farben.keys()) {
console.log(index);
}
Zahlenfolge erzeugen (range-Ersatz)
// Seitennummern 1 bis 5 für eine Paginierung
const seiten = [...Array(5).keys()].map((i) => i + 1);
console.log(seiten);
Unterschied zu Object.keys() bei dünn besetzten Arrays
const duenn = ['a', , 'c'];
console.log([...duenn.keys()]); // alle Indizes als Zahlen
console.log(Object.keys(duenn)); // nur belegte, als Strings
Manuelle Iteration und array-ähnliche Objekte
const iter = ['x', 'y'].keys();
console.log(iter.next()); // { value: 0, done: false }
console.log(iter.next()); // { value: 1, done: false }
console.log(iter.next()); // { value: undefined, done: true }
// Generisch: funktioniert mit allem, was length hat
const arrayAehnlich = { length: 3 };
console.log([...Array.prototype.keys.call(arrayAehnlich)]);
// Wichtig · Fallstricke
- Einmal verbrauchbar: Ein Iterator lässt sich nur einmal durchlaufen. Für einen zweiten Durchlauf muss
keys()erneut aufgerufen werden. - Kein Array: Der Rückgabewert ist ein Iterator und hat keine Methoden wie
map()oderfilter(). Er muss erst mit[...]oderArray.from()umgewandelt werden. Neuere Umgebungen bieten Iterator-Helfer wieiter.map()(ES2025), die aber noch nicht überall verfügbar sind. - Leere Stellen: Anders als
forEach()undObject.keys()werden leere Stellen nicht übersprungen. - Änderungen während der Iteration: Weil
lengthbei jedem Schritt neu gelesen wird, kann das Hinzufügen von Elementen innerhalb der Schleife eine Endlosschleife auslösen. - Braucht man Index und Wert, ist
entries()meist lesbarer. - Kompatibilität: Alle modernen Browser und Node.js 0.12+ unterstützen die Methode. Nicht verfügbar im Internet Explorer (Polyfill z. B. über core-js).