Baseline Widely available
**ÐÑÑажение yield*
**иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ñого, ÑÑÐ¾Ð±Ñ "пеÑедаÑÑ ÑпÑавление" ÑÑнкÑией-генеÑаÑоÑом дÑÑÐ³Ð¾Ð¼Ñ Ð³ÐµÐ½ÐµÑаÑоÑÑ
или иÑеÑиÑÑÐµÐ¼Ð¾Ð¼Ñ Ð¾Ð±ÑекÑÑ.
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"
СпеÑиÑикаÑии СовмеÑÑимоÑÑÑ Ñ Ð±ÑаÑзеÑами СпеÑиÑиÑнÑе Ð´Ð»Ñ Firefox пÑимеÑаниÑ
Реализована коÑÑекÑÐ½Ð°Ñ Ð¾Ð±ÑабоÑка ÑазÑÑва ÑÑÑоки. РазÑÑва ÑÑÑоки Ð¼ÐµÐ¶Ð´Ñ "yield" и "*" бÑÑÑ Ð½Ðµ можеÑ. Такой код вÑÐ·Ð¾Ð²ÐµÑ SyntaxError
:
function* foo() {
yield
*[];
}
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4