Array.prototype.values()
試一試
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"
語法
js
values()
引數
無。
返回值
一個新的可迭代迭代器物件。
描述
Array.prototype.values() 是 Array.prototype[Symbol.iterator]() 的預設實現。
js
Array.prototype.values === Array.prototype[Symbol.iterator]; // true
當在稀疏陣列上使用時,values() 方法會將空位迭代為 undefined 值。
values() 方法是通用的。它只期望 this 值具有 length 屬性和整數鍵的屬性。
示例
使用 for...of 迴圈進行迭代
因為 values() 返回一個可迭代迭代器,所以你可以使用 for...of 迴圈來迭代它。
js
const arr = ["a", "b", "c", "d", "e"];
const iterator = arr.values();
for (const letter of iterator) {
console.log(letter);
} // "a" "b" "c" "d" "e"
使用 next() 進行迭代
因為返回值也是一個迭代器,你可以直接呼叫它的 next() 方法。
js
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
重用可迭代物件
警告: 陣列迭代器物件應該是一次性使用的物件。請勿重複使用它。
從 values() 返回的可迭代物件不可重用。當 next().done = true 或 currentIndex > length 時,for...of 迴圈會結束,進一步迭代它不會產生任何效果。
js
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);
}
// undefined
如果你使用 break 語句提前結束迭代,當繼續迭代時,迭代器可以從當前位置恢復。
js
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"
迭代過程中的更改
從 values() 返回的陣列迭代器物件中不儲存任何值;相反,它儲存建立時使用的陣列的地址,並在每次迭代時讀取當前訪問的索引。因此,其迭代輸出取決於在進行步進時儲存在該索引中的值。如果陣列中的值發生更改,陣列迭代器物件的值也會隨之更改。
js
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"
與迭代方法不同,陣列迭代器物件不會儲存建立時的陣列長度,而是在每次迭代時讀取一次。因此,如果在迭代過程中陣列增長,迭代器也會訪問新元素。這可能會導致無限迴圈。
js
const arr = [1, 2, 3];
for (const e of arr) {
arr.push(e * 10);
}
// RangeError: invalid array length
迭代稀疏陣列
values() 會將空位訪問為 undefined。
js
for (const element of [, "a"].values()) {
console.log(element);
}
// undefined
// 'a'
在非陣列物件上呼叫 values()
values() 方法讀取 this 的 length 屬性,然後訪問鍵為小於 length 的非負整數的每個屬性。
js
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
規範
| 規範 |
|---|
| ECMAScript® 2026 語言規範 # sec-array.prototype.values |
瀏覽器相容性
載入中…