From 074785cea106179cb3305637055ab0a009ca74f2 Mon Sep 17 00:00:00 2001 From: Peter Bengtsson Date: Tue, 8 Dec 2020 14:42:52 -0500 Subject: initial commit --- .../reference/operators/yield_star_/index.html | 227 +++++++++++++++++++++ 1 file changed, 227 insertions(+) create mode 100644 files/ru/web/javascript/reference/operators/yield_star_/index.html (limited to 'files/ru/web/javascript/reference/operators/yield_star_') diff --git a/files/ru/web/javascript/reference/operators/yield_star_/index.html b/files/ru/web/javascript/reference/operators/yield_star_/index.html new file mode 100644 index 0000000000..c20f6969e6 --- /dev/null +++ b/files/ru/web/javascript/reference/operators/yield_star_/index.html @@ -0,0 +1,227 @@ +--- +title: yield* +slug: Web/JavaScript/Reference/Operators/yield* +translation_of: Web/JavaScript/Reference/Operators/yield* +--- +
{{jsSidebar("Operators")}}
+ +

Выражение yield* используется для того, чтобы "передать упраевление" функцией-генератором другому {{jsxref("Statements/function*", "генератору")}} или итерируемому объекту.

+ +

Синтаксис

+ +
 yield* [[expression]];
+ +
+
expression
+
Итерируемый объект
+
+ +

Описание

+ +

Выражение yield* в функции-генераторе принимает итерируемый объект и возвращает его значения по очереди, как если бы эта функция-генератор возвращала иъ сама.

+ +

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

+ +

Примеры

+ +

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

+ +

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

+ +
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);
+  // Определение этого итератора ниже
+  yield* new PowesOfTwo(4)
+}
+
+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: 1, done: false }
+console.log(iterator.next()); // { value: 2, done: false }
+console.log(iterator.next()); // { value: 4, done: false }
+
+console.log(iterator.next()); // { value: undefined, done: true }
+
+// Итератор, который возвращает все степени двойки
+// до maximum включительно
+class PowersOfTwo {
+  constructor(maximum) {
+    this.maximum = maximum
+    this.value = 1
+  }
+  [Symbol.iterator]() {
+    const self = this
+    return {
+      next() {
+        if(self.value > self.maximum) return { done: true }
+
+        const value = self.value
+        self.value *= 2
+        return { done: false, value }
+      }
+    }
+  }
+}
+
+ +

Собственное значение выражения 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"
+
+ +

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

+ + + + + + + + + + + + + + + + + + + + + +
SpecificationStatusComment
{{SpecName('ES6', '#', 'Yield')}}{{Spec2('ES6')}}Initial definition.
{{SpecName('ESDraft', '#', 'Yield')}}{{Spec2('ESDraft')}}
+ +

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

+ +

{{CompatibilityTable}}

+ +
+ + + + + + + + + + + + + + + + + + + +
FeatureChromeFirefox (Gecko)Internet ExplorerOperaSafari (WebKit)
Basic support{{CompatVersionUnknown}}{{CompatGeckoDesktop("27.0")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +
+ + + + + + + + + + + + + + + + + + + +
FeatureAndroidFirefox Mobile (Gecko)IE MobileOpera MobileSafari Mobile
Basic support{{CompatVersionUnknown}}{{CompatGeckoMobile("27.0")}}{{CompatUnknown}}{{CompatUnknown}}{{CompatUnknown}}
+
+ +

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

+ + + +

See also

+ + -- cgit v1.2.3-54-g00ecf