JS JavaScript  ·  30 вопросов  ·  ~85 мин  ·  ⏱ Таймер 25:00  ·  Сложный  · 

Итераторы и генераторы

Профессиональный тест о протоколах iterable/iterator, генераторах, yield и ленивых последовательностях. Нужно точно понимать закрытие итератора при раннем выходе, двустороннюю передачу значений и цену абстракции на больших потоках данных.

Отвечено: 0 из 30
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. В тесте 30 вопросов и 85 минут; код лучше читать построчно, не полагаясь на первое впечатление. После завершения откроются общий процент, 6 тематических шкал и объяснение каждого решения.
Вопрос 1 из 30
Какая пара должна завершить итератор?
JavaScript
const iterator = source[Symbol.iterator]();
let step;
do { step = iterator.next(); } while (!step.done);
Вопрос 2 из 30
Что сделает for...of при break, если у iterator есть return?
JavaScript
const source = {
  [Symbol.iterator]() {
    return { next: makeStep, return() { close(); return { done: true }; } };
  }
};
for (const x of source) { break; }
Вопрос 3 из 30
Почему объект с next, но без Symbol.iterator, нельзя напрямую передать в for...of?
JavaScript
const it = {
  next() { return { value: 1, done: false }; }
};
for (const x of it) {}
Вопрос 4 из 30
Может ли iterator вернуть значение вместе с done: true?
Вопрос 5 из 30
Что должен делать корректный iterator после первого done: true?
Вопрос 6 из 30
Почему range можно обходить дважды?
JavaScript
const range = {
  from: 1, to: 3,
  [Symbol.iterator]() {
    let i = this.from;
    return { next: () => i <= this.to ? { value: i++, done: false } : { done: true } };
  }
};
Вопрос 7 из 30
Что покажут два последовательных разворачивания одноразового итератора?
JavaScript
const oneShot = {
  i: 0,
  next() { return this.i < 2 ? { value: ++this.i, done: false } : { done: true }; },
  [Symbol.iterator]() { return this; }
};
console.log([...oneShot], [...oneShot]);
Вопрос 8 из 30
Что должно вернуть [Symbol.iterator]?
JavaScript
const bad = {
  [Symbol.iterator]() { return []; }
};
console.log([...bad]);
Вопрос 9 из 30
Какой синтаксис потребляет sync iterable?
JavaScriptПотребление iterable
const values = [...source];
Вопрос 10 из 30
Почему plain object не обходится for...of автоматически?
Вопрос 11 из 30
Когда выполняется строка start?
JavaScript
function* make() {
  console.log("start");
  yield 1;
}
const g = make();
Вопрос 12 из 30
Что выведется?
JavaScript
function* g() {
  const x = yield 1;
  console.log(x);
}
const it = g();
it.next(10);
it.next(20);
Вопрос 13 из 30
Каков результат второго next?
JavaScript
function* g() {
  yield 1;
  return 5;
}
const it = g();
it.next();
console.log(it.next());
Вопрос 14 из 30
Что делает yield* inner()?
JavaScript
function* inner() { yield 1; return 7; }
function* outer() {
  const result = yield* inner();
  yield result;
}
console.log([...outer()]);
Вопрос 15 из 30
Что произойдёт при it.throw(error) на паузе yield?
Вопрос 16 из 30
Почему take должен вызвать return у источника после получения лимита?
JavaScript
function* take(source, limit) {
  let count = 0;
  for (const value of source) {
    if (count++ === limit) return;
    yield value;
  }
}
Вопрос 17 из 30
Как безопасно взять первые пять квадратов бесконечной последовательности?
JavaScript
function* naturals() { for (let n = 1;; n++) yield n; }
console.log([...take(map(naturals(), n => n * n), 5)]);
Вопрос 18 из 30
Почему такой filter может читать очень долго до первого результата?
JavaScript
function* filter(source, predicate) {
  for (const value of source) if (predicate(value)) yield value;
}
const first = filter(naturals(), n => n === 1_000_000_000).next();
Вопрос 19 из 30
Когда memoized iterable меняет семантику источника?
Вопрос 20 из 30
Что предпочтительнее для пяти известных значений без дорогого источника?
Вопрос 21 из 30
Почему второй Array.from(iterator) пуст?
JavaScript
const iterator = [1, 2, 3].values();
console.log(Array.from(iterator));
console.log(Array.from(iterator));
Вопрос 22 из 30
Как проверить освобождение ресурса при ошибке потребителя?
JavaScript
function* rows() {
  try { yield* readRows(); }
  finally { closeFile(); }
}
for (const row of rows()) { throw new Error("consumer failed"); }
Вопрос 23 из 30
Из-за чего custom iterator может зависнуть?
Вопрос 24 из 30
Что логировать для поиска потерянного элемента?
Вопрос 25 из 30
Почему тест только spread не проверяет финальное return генератора?
Вопрос 26 из 30
Почему генератор может быть медленнее простого цикла в горячем месте?
JavaScript
function* map(source, fn) {
  for (const x of source) yield fn(x);
}
for (const x of map(bigArray, transform)) consume(x);
Вопрос 27 из 30
Что опасно в [...hugeGenerator()]?
JavaScript
const all = [...readMillionsOfRows()];
Вопрос 28 из 30
Как уменьшить число промежуточных объектов в цепочке map/filter?
Вопрос 29 из 30
Какой API лучше выражает обязательное закрытие внешнего ресурса?
Вопрос 30 из 30
Когда async iterable уместнее sync iterable?

Ответьте на все 30 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу