Array.prototype.values()

Baseline 已廣泛支援

此功能已成熟,並可在許多裝置和瀏覽器版本上執行。自 2018 年 5 月起,它已在各個瀏覽器中可用。

values() 方法用於 Array 例項,它會返回一個新的陣列迭代器物件,該物件會遍歷陣列中的每個元素值。

試一試

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 = truecurrentIndex > 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() 方法讀取 thislength 屬性,然後訪問鍵為小於 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

瀏覽器相容性

另見