2017-05-12 13 views
0

たとえば、ES6ジェネレータの結果を配列変数に代入したいとしましょう。ES6ジェネレータからアレイを作成する

function* gen() { 
 
    for(let i = 0; i < 3; i++) { 
 
     yield i; 
 
    } 
 
} 
 

 
let [...b] = gen(); 
 
console.log(b); // [0, 1, 2]

ここ

b[0, 1, 2]が割り当てられます。なぜこれは機能しますか?

+1

見た目...気違い。 *私の最初の試みは、 'const b = Array.from(gen)'のようなものでした。ジェネレータはiterableで、 'Array.from'はiterableを取るので、私は*動作するはずです。編集:さて、閉じる: 'const b = Array.from(gen())'実際に動作します。 –

答えて

1

私は答えがthis postであると思っています。 ...演算子はここでは残りの演算子です。配列の構造を解除するために使用すると、構造化されていない配列のすべての未割り当て要素が別の配列に割り当てられます。残りの演算子は、構造化された値を受け取る変数のリストの最後の項目で使用する必要があります。たとえば:bは残りの演算子を使用して非構造とその中の唯一のものですので、質問に

let a = [1, 2, 3, 4, 5]; 
 
let [first, second, ...remainder] = a; 
 

 
console.log(first); // 1 
 
console.log(second); // 2 
 
console.log(remainder); // [3, 4, 5]

、配列全体は、それに割り当てられます。

ES6がジェネレータを実行し、結果を=の右側の配列に変換するように見えます。

+0

この回答は発電機との相互作用について説明していません。 – jfriend00

+0

[こちら](http://exploringjs.com/es6/ch_destructuring.html#sec_destructuring-algorithm)は、構造解除アルゴリズムの詳細な説明です。 – ccprog

+0

['... ...は演算子ではありません!](https:///stackoverflow.com/questions/37151966/what-is-spreadelement-in-ecmascript-documentation-is-it-theame-as-spread-oper/37152508#37152508) –

2

ジェネレータは、呼び出されるとiteratorを返します。我々は可能性for … ofループ付きイテレータによる例のforループ:

for (const item of gen()) { 
    console.log(item); 
} 

だけで発電機の各項目を通過します:

:我々は spread syntaxを呼び出す場合

0 
1 
2 

同じ事が、起こります は

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

resは次のようになります。

[0, 1, 2] 

例では、非構造化割り当てを使用しています。ブラケットシンタックスを使用して破壊すると、イテラブルを呼び出して値を取得します(配列の原則と同じ)。例:あなたはrest syntaxを使用しているので

const [a, b] = gen(); 
// a: 0, b: 1 

、あなたは基本的に言っている:私は、イテレータに残っているすべての値を付け、変数bに保存:

let [...b] = gen(); 
// b: [0, 1, 2] 

const [a, b, ...c] = 'hello'; 
// a: 'h', b: 'e', c: 'llo' 

は個人的に、私はおよそ理由にずっと楽以下見つける:

これは、任意のiterable上で動作します0
const res = [...gen()]; 
+0

私はあなたの最後の例に同意します:それ、または'const res = Array.from(gen())' *両方とも*明示的に*ジェネレータから配列を作成します。一つのバージョンは配列の括弧を使って行い、もう一つのバージョンは文字通り '' Array''から ''作成する ''という文を綴ります。どちらも相互作用が少ないので、両方ともrea {d | son about}の方が簡単です:destructuringの割り当てとiterablesとのやりとりの仕方はどちらも存在しません。 –

+0

['... 'は演算子ではありません!](https://stackoverflow.com/questions/37151966/what-is-spreadelement-in-ecmascript-documentation-is-it-the-same-as-spread- oper/37152508#37152508) –

+0

フェリックスありがとう、私は普及のためにそれを得たが、安静のためにそれを台無しにした;) – nils

関連する問題