Перевод не завершен. Пожалуйста, помогите перевести эту статью с английского.

yield* expression используется для делегирования генератору или итерируемому объекту.

Синтаксис

 yield* [[expression]];
expression
Выражение, которое возвращает итерируемый объект.

Описание

Выражение yield* итерирует операнды и присваивает каждому, возвращаемые им значения.

Значение выражения yield* само по себе равно значению, возвращаемому итератором, когда он завершает выполнение (т.е., когда done равно true).

Примеры

Передача другому генератору

В следующем примере, значения полученные из g1() возвращаются вызовом next() также, как и вычисленные в g2().

function* g1() {
  yield 2;
  yield 3;
  yield 4;
}

function* g2() {
  yield 1;
  yield* g1();
  yield 5;
}

var iterator = g2();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: 4, done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Другие итерируемые объекты

Помимо объектов генераторов, yield* может перебирать другие виды итерируемых объектов, т.е. массивы, строки и объекты аргументов.

function* g3() {
  yield* [1, 2];
  yield* "34";
  yield* Array.from(arguments);
}

var iterator = g3(5, 6);

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: "3", done: false }
console.log(iterator.next()); // { value: "4", done: false }
console.log(iterator.next()); // { value: 5, done: false }
console.log(iterator.next()); // { value: 6, done: false }
console.log(iterator.next()); // { value: undefined, done: true }

Собственное значение выражения yield*

yield* выражение, а не оператор, поэтому вычисляется как значение

function* g4() {
  yield* [1, 2, 3];
  return "foo";
}

var result;

function* g5() {
  result = yield* g4();
}

var iterator = g5();

console.log(iterator.next()); // { value: 1, done: false }
console.log(iterator.next()); // { value: 2, done: false }
console.log(iterator.next()); // { value: 3, done: false }
console.log(iterator.next()); // { value: undefined, done: true }, 
                              // g4() в этой точке вернёт { value: "foo", done: true }

console.log(result);          // "foo"

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

Specification Status Comment
ECMAScript 2015 (6th Edition, ECMA-262)
Определение 'Yield' в этой спецификации.
Стандарт Initial definition.
ECMAScript Latest Draft (ECMA-262)
Определение 'Yield' в этой спецификации.
Черновик

Поддержка браузерами

We're converting our compatibility data into a machine-readable JSON format. This compatibility table still uses the old format, because we haven't yet converted the data it contains. Find out how you can help!
Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari (WebKit)
Basic support (Да) 27.0 (27.0) ? ? ?
Feature Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
Basic support (Да) 27.0 (27.0) ? ? ?

Специфичные для Firefox примечания

  • Начиная с Gecko 33 (Firefox 33 / Thunderbird 33 / SeaMonkey 2.30), разбор выражений yield было приведено к соответствию с последними спецификациями ES6 (баг 981599):
    • Реализована корректная обработка разрыва строки. Разрыва строки между "yield" и "*" быть не может. Такой код вызовет SyntaxError:
      function* foo() {
        yield
        *[];
      }

See also

Метки документа и участники

Внесли вклад в эту страницу: utlov, mdnwebdocs-bot, d4rkm3z
Обновлялась последний раз: utlov,