没有逗号的收益数组

时间:2018-02-02 03:57:44

标签: javascript ecmascript-6 generator

我正在研究javascript ES6的生成器

虽然我试图理解我的书的一个例子,但由于下面的代码中没有逗号的数组,我遇到了麻烦。

此代码如何运作?

[code]

let gen = function*(){
    return [yield yield]; // how this code line works?
}
let genObj = gen();
console.log(genObj.next());
console.log(genObj.next(10));
console.log(genObj.next(20));

[运行结果]

Object {value: undefined, done: false}
Object {value: 10, done: false}
Object {value: Array[1], done: true}

[test - 1]

let gen = function*(){
    return ['a' 'b'];
}
// Uncaught SyntaxError: Unexpected string

[test - 2]

let a = [yield yield]

// Uncaught SyntaxError: Unexpected identifier

2 个答案:

答案 0 :(得分:6)

我将专注于你的第一个例子:

return [yield yield];

此行从右到左运行。最右侧yielditerator的调用者发送value undefined(这是genObj是一个迭代器)。在您调用genObj.next(10)的行上,您将10传递到函数gen()并在最右侧yield恢复执行,就好像{{1}变成yield

10

现在,控制台会记录return [yield 10]; ,因为那是您10的下一个value。然后你传入yield所以实际上函数恢复如下:

20

所以记录的最后一次返回return [20]; 是一个包含值value的{​​{1}}数组。

答案 1 :(得分:4)

您的代码等同于以下内容:



let gen = function*(){
    let x = yield;
    let y = yield x;
    return [y];
}
let genObj = gen();
console.log(genObj.next());
console.log(genObj.next(10));
console.log(genObj.next(20));




[yield yield]不是元素之间没有逗号的数组,它是单个元素的数组,表达式yield yield

yield yield首先评估右yield。它没有参数,因此从第一次调用undefined返回.next()。第二个.next()传递10,其成为yield的结果值。

10传递给第二个yield,显示为第二个.next()调用的返回值。第三个.next()调用通过了20,这将成为第二个yield的结果值。

然后,该函数将此20包装在数组[ ]中并返回。