2017-05-16 9 views
0

私はこの例を見つけました。私は、最終的にジェネレータの値がジェネレータから得られるという驚くべきことでした。これはコードです:私の発電機の理解に基づいてジェネレータ関数を使用した非構造化配列はどのように機能しますか?

function* foo() { 
    yield 'a'; 
    yield 'b'; 
    yield 'c'; 
} 

const [...values] = foo(); 

、私はジェネレータの実行を構造化代入することと等価であることを考える:

const array = []; 
for(const val of foo()) { 
    array.push(val) 
} 

ので、私の質問は次のとおりです。それが有効なアプローチでこれですこれを達成するためにジェネレータ関数の値と他の方法が存在するかどうかを調べるには?

+0

私にa'ight思われること –

+2

「これはValでIDアプローチ? - [それは動作しますか?はい?その後、それは有効です。](https://esfiddle.net/j2ruoocs/) "これを達成するための他の方法はありますか?"たくさん。そのビットはあまりにも広すぎてSOの問題ではないでしょうか。 –

+1

これは有効ですが、 'const values = [... foo()]'や 'const values = Array.from(foo())'よりも読みにくいです。 –

答えて

5

反復(反復可能な&イテレータ)あなたの可能性の海を提供プロトコル...

function* foo() { 
 
    yield 'a'; 
 
    yield 'b'; 
 
    yield 'c'; 
 
} 
 

 
const [...values] = foo(); 
 

 
console.log(...values);

function* foo() { 
 
    yield 'a'; 
 
    yield 'b'; 
 
    yield 'c'; 
 
} 
 

 
const [a, b, c] = foo(); 
 

 
console.log(a, b, c);

function* foo() { 
 
    yield 'a'; 
 
    yield 'b'; 
 
    yield 'c'; 
 
}; 
 

 
let values = []; 
 

 
for (const str of foo()) { 
 
    values.push(str); 
 
} 
 

 
console.log(values[0], values[1], values[2]);

function* foo() { 
 
    yield 'a'; 
 
    yield 'b'; 
 
    yield 'c'; 
 
} 
 

 
const [a, b, ...values] = Array.from(foo()); 
 

 
console.log(a, b, values.toString());

let foo = (function*() { 
 
    yield 'a'; 
 
    yield 'b'; 
 
    yield 'c'; 
 
})(); 
 

 
console.log(foo.next().value, foo.next().value, foo.next().value);

関連する問題