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 |
浏览器兼容性
加载中…