Array.prototype.values()
Baseline
Weitgehend verfügbar
Diese Funktion ist gut etabliert und funktioniert auf vielen Geräten und in vielen Browserversionen. Sie ist seit Mai 2018 browserübergreifend verfügbar.
Die Methode values() von Array-Instanzen gibt ein neues Array-Iterator-Objekt zurück, das über die Werte der einzelnen Elemente im Array iteriert.
Probieren Sie es aus
const array = ["a", "b", "c"];
const iterator = array.values();
for (const value of iterator) {
console.log(value);
}
// Expected output: "a"
// Expected output: "b"
// Expected output: "c"
Syntax
values()
Parameter
Keine.
Rückgabewert
Ein neues iterierbares Iterator-Objekt.
Beschreibung
Array.prototype.values() ist die Standardimplementierung von Array.prototype[Symbol.iterator]().
Array.prototype.values === Array.prototype[Symbol.iterator]; // true
Bei Arrays mit Lücken behandelt die Methode values() leere Positionen bei der Iteration so, als hätten sie den Wert undefined.
Die Methode values() ist generisch. Sie setzt lediglich voraus, dass der this-Wert eine length-Eigenschaft und Eigenschaften mit ganzzahligen Schlüsseln hat.
Beispiele
>Iteration mit einer for...of-Schleife
Da values() einen iterierbaren Iterator zurückgibt, können Sie mit einer for...of-Schleife darüber iterieren.
const arr = ["a", "b", "c", "d", "e"];
const iterator = arr.values();
for (const letter of iterator) {
console.log(letter);
} // "a" "b" "c" "d" "e"
Iteration mit next()
Da der Rückgabewert auch ein Iterator ist, können Sie seine Methode next() direkt aufrufen.
const arr = ["a", "b", "c", "d", "e"];
const iterator = arr.values();
iterator.next(); // { value: "a", done: false }
iterator.next(); // { value: "b", done: false }
iterator.next(); // { value: "c", done: false }
iterator.next(); // { value: "d", done: false }
iterator.next(); // { value: "e", done: false }
iterator.next(); // { value: undefined, done: true }
console.log(iterator.next().value); // undefined
Wiederverwendung des iterierbaren Objekts
Warnung: Das Array-Iterator-Objekt sollte nur einmal verwendet werden. Verwenden Sie es nicht erneut.
Das von values() zurückgegebene iterierbare Objekt kann nicht wiederverwendet werden. Wenn next().done = true oder currentIndex > length gilt, endet die for...of-Schleife. Eine weitere Iteration über das Objekt hat dann keine Wirkung.
const arr = ["a", "b", "c", "d", "e"];
const values = arr.values();
for (const letter of values) {
console.log(letter);
}
// "a" "b" "c" "d" "e"
for (const letter of values) {
console.log(letter);
}
// No output
Wenn Sie die Iteration mit einer break-Anweisung vorzeitig beenden, kann der Iterator bei einer erneuten Iteration an der aktuellen Position fortfahren.
const arr = ["a", "b", "c", "d", "e"];
const values = arr.values();
for (const letter of values) {
console.log(letter);
if (letter === "b") {
break;
}
}
// "a" "b"
for (const letter of values) {
console.log(letter);
}
// "c" "d" "e"
Änderungen während der Iteration
Das von values() zurückgegebene Array-Iterator-Objekt speichert keine Werte. Stattdessen speichert es eine Referenz auf das Array, mit dem es erstellt wurde, und liest bei jedem Iterationsschritt den jeweils besuchten Index aus. Die ausgegebenen Werte hängen daher davon ab, welcher Wert zum Zeitpunkt des jeweiligen Schritts an diesem Index gespeichert ist. Ändern sich die Werte im Array, ändern sich auch die vom Array-Iterator-Objekt ausgegebenen Werte.
const arr = ["a", "b", "c", "d", "e"];
const iterator = arr.values();
console.log(iterator); // Array Iterator { }
console.log(iterator.next().value); // "a"
arr[1] = "n";
console.log(iterator.next().value); // "n"
Anders als iterative Methoden speichert das Array-Iterator-Objekt die Länge des Arrays nicht zum Zeitpunkt seiner Erstellung, sondern liest sie bei jedem Iterationsschritt erneut. Wächst das Array während der Iteration, besucht der Iterator daher auch die neuen Elemente. Dies kann zu Endlosschleifen führen.
const arr = [1, 2, 3];
for (const e of arr) {
arr.push(e * 10);
}
// RangeError: invalid array length
Iteration über Arrays mit Lücken
values() besucht leere Positionen so, als enthielten sie undefined.
for (const element of [, "a"].values()) {
console.log(element);
}
// undefined
// 'a'
Aufruf von values() für Objekte, die keine Arrays sind
Die Methode values() liest die length-Eigenschaft von this und greift anschließend auf jede Eigenschaft zu, deren Schlüssel eine nichtnegative Ganzzahl kleiner als length ist.
const arrayLike = {
length: 3,
0: "a",
1: "b",
2: "c",
3: "d", // ignored by values() since length is 3
};
for (const entry of Array.prototype.values.call(arrayLike)) {
console.log(entry);
}
// a
// b
// c
Spezifikationen
| Spezifikation |
|---|
| ECMAScript® 2027 Language Specification> # sec-array.prototype.values> |