Spec-Zone.ru › JavaScript

Iterator.prototype.take()

Базовая версия Недавно появился

Эта функция работает на последних устройствах и версиях браузеров. Эта функция может не работать на старых устройствах или версиях браузеров. Она доступна во всех браузерах с марта 2025 года.

Метод take() экземпляров Iterator возвращает новый объект-помощник итератора, который выдает заданное количество элементов в этом итераторе, а затем завершается.

Синтаксис

take(limit)

Параметры

limit
Количество элементов, которые нужно взять с начала итерации.

Возвращаемое значение

Новый объект-помощник итератора. Возвращенный помощник итератора выдает элементы исходного итератора по одному, а затем завершается (метод next() выдает { value: undefined, done: true }), как только будет выдано limit элементов, или когда исходный итератор исчерпается, в зависимости от того, что произойдет раньше.

Исключения

RangeError
Выбрасывается, если limit становится NaN или отрицательным при преобразовании в целое число.

Примеры

Использование take()

Следующий пример создает итератор, который выдает члены последовательности Фибоначчи, а затем выводит в консоль первые три члена:

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:

for (const n of fibonacci().take(5)) {
  console.log(n);
}

// Logs:
// 1
// 1
// 2
// 3
// 5

Поскольку fibonacci() является бесконечным итератором, использование цикла for для его итерации без какой-либо логики для раннего выхода (например, оператора break) приведет к бесконечному циклу.

Комбинирование drop() и take()

Вы можете комбинировать take() с Iterator.prototype.drop(), чтобы получить срез итератора:

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:

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

Когда limit превышает общее количество элементов, которое может произвести итератор (например, Infinity), возвращенный помощник итератора имеет по существу то же поведение, что и исходный итератор:

for (const n of new Set([1, 2, 3]).values().take(Infinity)) {
  console.log(n);
}

// Logs:
// 1
// 2
// 3

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-iterator.prototype.take

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
take
122
117–119
122
117–119
131
108
103–105
18.4
122
117–119
131
81
78–79
18.4
26.0
24.0–25.0
122
117–119
18.4
1.1.31
1.39
22.0.0

Смотрите также

  • Полифил Iterator.prototype.take в core-js
  • Полифил es-shims для Iterator.prototype.take
  • Iterator
  • Iterator.prototype.drop()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Iterator/take

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API