Iterator.prototype.take()
Iterator
实例的 take()
方法返回一个新的 迭代器帮助器,它会生成此迭代器中的指定数量的元素,然后终止。
语法
js
take(limit)
参数
limit
-
要从迭代开始处获取的元素数量。
返回值
一个新的 迭代器帮助器。返回的迭代器帮助器会逐个生成原始迭代器中的元素,然后完成(next()
方法生成 { value: undefined, done: true }
),一旦生成了 limit
个元素,或者原始迭代器已耗尽,以先发生者为准。
异常
示例
使用 take()
以下示例创建了一个生成斐波那契数列中项的迭代器,然后记录前三个项
js
function* fibonacci() {
let current = 1;
let next = 1;
while (true) {
yield current;
[current, next] = [next, current + next];
}
}
const seq = fibonacci().take(3);
console.log(seq.next().value); // 1
console.log(seq.next().value); // 1
console.log(seq.next().value); // 2
console.log(seq.next().value); // undefined
将 take() 与 for...of 循环一起使用
当您没有手工滚动迭代器时,take()
最为方便。因为迭代器也是可迭代的,所以您可以使用 for...of
循环迭代返回的帮助器
js
for (const n of fibonacci().take(5)) {
console.log(n);
}
// Logs:
// 1
// 1
// 2
// 3
// 5
因为 fibonacci()
是一个无限迭代器,所以您不能使用 for
循环直接迭代它。
将 drop() 与 take() 结合使用
您可以将 take()
与 Iterator.prototype.drop()
结合使用,以获取迭代器的一部分
js
for (const n of fibonacci().drop(2).take(5)) {
// Drops the first two elements, then takes the next five
console.log(n);
}
// Logs:
// 2
// 3
// 5
// 8
// 13
for (const n of fibonacci().take(5).drop(2)) {
// Takes the first five elements, then drops the first two
console.log(n);
}
// Logs:
// 2
// 3
// 5
take 计数的上限和下限
当 limit
为负数或 NaN
时,会抛出 RangeError
js
fibonacci().take(-1); // RangeError: -1 must be positive
fibonacci().take(undefined); // RangeError: undefined must be positive
当 limit
大于迭代器可以生成的元素总数(例如 Infinity
)时,返回的迭代器帮助器与原始迭代器具有基本相同的行为
js
for (const n of new Set([1, 2, 3]).values().take(Infinity)) {
console.log(n);
}
// Logs:
// 1
// 2
// 3
规范
规范 |
---|
迭代器帮助器 # sec-iteratorprototype.take |
浏览器兼容性
BCD 表格仅在启用 JavaScript 的浏览器中加载。