Iterator.prototype.drop()

实验性: 这是一个 实验性技术
在生产环境中使用此技术之前,请仔细检查 浏览器兼容性表

drop() 方法是 Iterator 实例的方法,它返回一个新的 迭代器帮助器,该帮助器跳过此迭代器开头给定的元素数量。

语法

js
drop(limit)

参数

limit

从迭代开始处要跳过的元素数量。

返回值

一个新的 迭代器帮助器。第一次调用返回的迭代器帮助器的 next() 方法时,当前迭代器会立即前进 limit 个元素,然后返回下一个元素(第 limit+1 个元素)。迭代器帮助器随后会逐个返回剩余的元素。如果当前迭代器拥有的元素数量少于 limit,则新的迭代器帮助器将在第一次调用 next() 时立即完成。

异常

RangeError

如果 limit转换为整数 后变成 NaN 或负数,则会抛出此异常。

示例

使用 drop()

以下示例创建一个迭代器,该迭代器返回斐波那契数列中的项,从第三项开始,并跳过前两项

js
function* fibonacci() {
  let current = 1;
  let next = 1;
  while (true) {
    yield current;
    [current, next] = [next, current + next];
  }
}

const seq = fibonacci().drop(2);
console.log(seq.next().value); // 2
console.log(seq.next().value); // 3

这等同于

js
const seq = fibonacci();
seq.next();
seq.next();

将 drop() 与 for...of 循环一起使用

当您没有手动滚动迭代器时,drop() 最为方便。因为迭代器也是可迭代的,所以您可以使用 for...of 循环迭代返回的帮助器

js
for (const n of fibonacci().drop(2)) {
  console.log(n);
  if (n > 30) {
    break;
  }
}

// Logs:
// 2
// 3
// 5
// 8
// 13
// 21
// 34

将 drop() 与 take() 结合使用

您可以将 drop()Iterator.prototype.take() 结合使用,以获取迭代器的切片

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

drop 计数的下限和上限

limit 为负数或 NaN 时,会抛出 RangeError

js
fibonacci().drop(-1); // RangeError: -1 must be positive
fibonacci().drop(undefined); // RangeError: undefined must be positive

limit 大于迭代器可以产生的元素总数(例如 Infinity)时,返回的迭代器帮助器会立即跳过所有元素,然后在第一次调用 next() 时完成。如果当前迭代器是无限的,则返回的迭代器帮助器将永远不会完成。

js
fibonacci().drop(Infinity).next(); // Never ends
new Set([1, 2, 3]).values().drop(Infinity).next(); // { value: undefined, done: true }
new Set([1, 2, 3]).values().drop(4).next(); // { value: undefined, done: true }

规范

规范
迭代器帮助器
# sec-iteratorprototype.drop

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅