Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 生成器函数中的委托收益率(收益率星,收益率*)_Javascript_Ecmascript 6 - Fatal编程技术网

Javascript 生成器函数中的委托收益率(收益率星,收益率*)

Javascript 生成器函数中的委托收益率(收益率星,收益率*),javascript,ecmascript-6,Javascript,Ecmascript 6,ECMAScript 6应该包含生成器函数和迭代器。具有function*语法的生成器函数返回迭代器。迭代器有一个下一个方法,当反复调用该方法时,该方法执行生成器函数体,在每个yield操作符上反复暂停和恢复执行 还引入了委托收益率*运算符,如下所示: yield*操作符将委托给另一个生成器。这为组合生成器提供了一种方便的机制 委托给另一个生成器意味着什么?如何使用yield*方便地组合生成器 [您可以使用-harmony generators标志在节点v0.11.3中使用生成器。]委托给另一个

ECMAScript 6应该包含生成器函数和迭代器。具有function*语法的生成器函数返回迭代器。迭代器有一个下一个方法,当反复调用该方法时,该方法执行生成器函数体,在每个yield操作符上反复暂停和恢复执行

还引入了委托收益率*运算符,如下所示:

yield*操作符将委托给另一个生成器。这为组合生成器提供了一种方便的机制

委托给另一个生成器意味着什么?如何使用yield*方便地组合生成器

[您可以使用-harmony generators标志在节点v0.11.3中使用生成器。]

委托给另一个生成器意味着当前生成器停止自己生成值,而不是生成另一个生成器生成的值,直到它耗尽为止。然后,它继续生成自己的值(如果有的话)

例如,如果secondGenerator生成10到15的数字,firstGenerator生成1到5的数字,但在生成2后委托给secondGenerator,则firstGenerator生成的值将为:

函数*第一个生成器{ 产量1; 产量2; //委托给第二个生成器 产量*第二发电机; 产量3; 产量4; 产量5; } 函数*辅助生成器{ 产量10; 产量11; 产量12; 产量13; 产量14; 产量15; } console.logArray.fromfirstGenerator; 注释

具有yield*的函数从内部生成器请求11个值,但只接收它应该接收的10..15。超额收益*认购没有任何影响

内部生成器的done值对其调用者返回的done没有影响

输出显示未定义!最后,因为测试循环的编写超出了所需的值数量,以显示生成器的done=true

该输出来自ES6试验场,上述语义应视为截至2016年2月5日的暂定语义


委派的产出不必只委派给另一个生成器,而是委派给任何迭代器,因此第一个答案有点不确定。考虑这个简单的例子:

`
function *someGenerator() {
    yield 0;
    yield [1,2,3]
    yield* [1,2,3] 
}

for (v of someGenerator()) {
    console.log(v);
}

`

生成器本身中没有其他函数,但会产生对数组对象迭代器迭代器的委托-

比如说,这类似于生成器上的for in循环,所以yield*生成器应该类似于生成器{yield i;}的for i。如果你知道python,这就是它的功能。yield炸弹?函数*{yield*}.nextNice。事后看来,这是显而易见的,但我觉得哈特的规格值得一读。一个改进是添加生成您提到的结果的示例代码。yield*ten与yield*ten相同吗?
function *gimme1to2_10to15_3to5() {
    var ten = gimme10to15();
    yield 1; yield 2;
    for (var i = 10; i <= 20; i++)
        yield *ten;
    yield 3; yield 4; yield 5;
    }

function *gimme10to15() {
    for (var i = 10; i <= 15; i++)
        var x = yield i;
    }

let gen = gimme1to2_10to15_3to5();

var ar = [];
for (var i = 0; i < 12; i++)
    {
    var r = gen.next();
    ar [i] = r.value + (r.done ? "!" : "..");
    }
console.log (ar.join (", "));
1.., 2.., 10.., 11.., 12.., 13.., 14.., 15.., 3.., 4.., 5.., undefined!
`
function *someGenerator() {
    yield 0;
    yield [1,2,3]
    yield* [1,2,3] 
}

for (v of someGenerator()) {
    console.log(v);
}

`