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

Array.prototype.keys()

Methode

Gibt ein neues Array-Iterator-Objekt zurück, das nacheinander die Indizes (Schlüssel) aller Positionen des Arrays liefert, auch die leerer Stellen.

seit JavaScript ES2015 Kategorie: method-property

Signatur

Array.prototype.keys()

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

Typ
ArrayIterator<number>
Beschreibung
Ein neues Iterator-Objekt, das bei jedem 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);
}
0 1 2

Zahlenfolge erzeugen (range-Ersatz)

// Seitennummern 1 bis 5 für eine Paginierung
const seiten = [...Array(5).keys()].map((i) => i + 1);
console.log(seiten);
[1, 2, 3, 4, 5]

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
[0, 1, 2] ['0', '2']

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)]);
{ value: 0, done: false } { value: 1, done: false } { value: undefined, done: true } [0, 1, 2]

// 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() oder filter(). Er muss erst mit [...] oder Array.from() umgewandelt werden. Neuere Umgebungen bieten Iterator-Helfer wie iter.map() (ES2025), die aber noch nicht überall verfügbar sind.
  • Leere Stellen: Anders als forEach() und Object.keys() werden leere Stellen nicht übersprungen.
  • Änderungen während der Iteration: Weil length bei 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).