Array.prototype.values()
基线 广泛可用
此功能已得到良好建立,并在许多设备和浏览器版本中有效。它自 2018 年 5 月.
报告反馈
试一试
语法
js
参数
无。
返回值
描述
一个新的 可迭代的迭代器对象。
Array.prototype.values === Array.prototype[Symbol.iterator]; // true
Array.prototype.values()
是 Array.prototype[Symbol.iterator]()
的默认实现。
当在 稀疏数组 上使用时,values()
方法将空槽迭代为具有 value undefined
的槽。
示例
values()
方法是 泛型 的。它只期望 this
value 具有 length
属性和整数键属性。
因为 values()
返回一个可迭代的迭代器,所以可以使用 for...of
循环来迭代它。
使用 next() 迭代
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
因为返回值也是一个迭代器,所以可以直接调用它的 next()
方法。
重用可迭代对象
警告: 数组迭代器对象应该是只使用一次的对象。不要重用它。
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
从 values()
返回的可迭代对象不可重用。当 next().done = true
或 currentIndex > length
时,for...of
循环结束,并且进一步迭代它不会产生任何效果。
如果使用 break
语句提前结束迭代,则迭代器可以在继续迭代时从当前位置恢复。
迭代期间的修改
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"
从 values()
返回的数组迭代器对象中没有存储任何 value;相反,它存储创建时使用的数组的地址,并在每次迭代时读取当前访问的索引。因此,它的迭代输出取决于该索引在步进时存储的值。如果数组中的值发生变化,数组迭代器对象的 value 也会发生变化。
与 迭代方法 不同,数组迭代器对象不会在创建时保存数组的长度,而是在每次迭代时读取一次。因此,如果数组在迭代期间增长,迭代器也会访问新元素。这可能会导致无限循环。
values()
将访问空槽,就好像它们是 undefined
一样。
规范
values() 方法读取 this 的 length 属性,然后访问每个键为非负整数且小于 length 的属性。 |
---|
规范 # ECMAScript 语言规范 |
浏览器兼容性
sec-array.prototype.values