Javascript 从ES6生成器创建阵列

Javascript 从ES6生成器创建阵列,javascript,ecmascript-6,generator,Javascript,Ecmascript 6,Generator,假设我想将ES6生成器的结果分配给数组变量 函数*gen(){ for(设i=0;i

假设我想将ES6生成器的结果分配给数组变量

函数*gen(){
for(设i=0;i<3;i++){
产量一;
}
}
设[…b]=gen();

控制台日志(b);//[0,1,2]
我想我找到了答案。这里的
运算符是rest运算符。当用于分解数组时,它会将要分解的数组中所有未分配的元素分配给另一个数组。rest运算符必须用于接收解构值的变量列表中的最后一项。例如:

a=[1,2,3,4,5];
设[第一,第二,…余数]=a;
console.log(第一个);//1.
console.log(秒);//2.

console.log(余数);//[3,4,5]
我想我找到了答案。这里的
运算符是rest运算符。当用于分解数组时,它会将要分解的数组中所有未分配的元素分配给另一个数组。rest运算符必须用于接收解构值的变量列表中的最后一项。例如:

a=[1,2,3,4,5];
设[第一,第二,…余数]=a;
console.log(第一个);//1.
console.log(秒);//2.

console.log(余数);//[3,4,5]
生成器在调用时返回一个。例如,我们可以使用
for…of
循环遍历迭代器:

for (const item of gen()) {
  console.log(item);
}
只需浏览生成器中的每个项目:

0
1
2
同样的事情也会发生,如果我们调用:

res
将是:

[0, 1, 2]
在您的示例中,您使用的是一个分解赋值。使用括号语法进行解构将调用iterable来获取值(数组的原理相同)。例如:

const [a, b] = gen();
// a: 0, b: 1
由于您使用的是,您的基本意思是:将迭代器中剩下的所有值都给我,并将它们保存在变量
b

let [...b] = gen();
// b: [0, 1, 2]
这适用于任何iterable:

const [a, b, ...c] = 'hello';
// a: 'h', b: 'e', c: 'llo'
就我个人而言,我发现以下几点更容易推理:

const res = [...gen()];

生成器在调用时返回一个。例如,我们可以使用
for…of
循环遍历迭代器:

for (const item of gen()) {
  console.log(item);
}
只需浏览生成器中的每个项目:

0
1
2
同样的事情也会发生,如果我们调用:

res
将是:

[0, 1, 2]
在您的示例中,您使用的是一个分解赋值。使用括号语法进行解构将调用iterable来获取值(数组的原理相同)。例如:

const [a, b] = gen();
// a: 0, b: 1
由于您使用的是,您的基本意思是:将迭代器中剩下的所有值都给我,并将它们保存在变量
b

let [...b] = gen();
// b: [0, 1, 2]
这适用于任何iterable:

const [a, b, ...c] = 'hello';
// a: 'h', b: 'e', c: 'llo'
就我个人而言,我发现以下几点更容易推理:

const res = [...gen()];

那看起来…很疯狂。我的第一次尝试是类似于
const b=Array.from(gen)
,我假设它应该可以工作,因为生成器是iterable,而
Array.from
接受iterable。编辑:好的,关闭:
const b=Array.from(gen())
确实有效。这看起来……很疯狂。我的第一次尝试是类似于
const b=Array.from(gen)
,我假设它应该可以工作,因为生成器是iterable,而
Array.from
接受iterable。编辑:好的,关闭:
const b=Array.from(gen())
确实有效。这个答案不能解释与生成器的交互。是对分解算法的深入讨论。这个答案不能解释与生成器的交互作用。是否深入讨论了解构算法?我同意您的最后一个示例:即,或
const res=Array.from(gen())
都明确说明您从生成器创建了一个数组。一个版本是通过使用数组括号来实现的,另一个版本是通过逐字拼写句子“create
from
an
array
”来实现的。这两种方法都更容易理解,因为它们少了一个交互作用:解构任务以及它如何与iterables交互,这两种方法都没有。谢谢Felix,我在传播时做对了,但在其他时候把它搞砸了;)我同意你的最后一个例子:或
const res=Array.from(gen())
都明确说明你从生成器创建了一个数组。一个版本是通过使用数组括号来实现的,另一个版本是通过逐字拼写句子“create
from
an
array
”来实现的。这两种方法都更容易理解,因为它们少了一个交互作用:解构任务以及它如何与iterables交互,这两种方法都没有。谢谢Felix,我在传播时做对了,但在其他时候把它搞砸了;)