最近ES6のことをちょっと勉強していて気づいたことをメモ
ES6からyield
が導入されるらしく非同期の処理などが楽になるのではないかと期待しているのですが、
最近firefox
でyieldを試していると、挙動が違う2つのyield
があることに気づきました。
*Firefox 27で試しています。
ES6から導入されたyield
は返り値としてdone
とresult
の2つの値ををもつオブジェクトを返します。
funciton * gen(){
yield 1;
yield 2;
}
g = gen();
g.next(); // {done: false, result: 1}
g,next(); // {done: false, result: 2}
g.next(); // {done: true, result: undefined} つぎのyieldがないとdone: trueになる
しかし、Firefoxは実はJavaScript1.7(2006年!)からyield
が使えたらしく
funciton gen(){
yield 1;
yield 2;
}
g = gen();
g.next(); // 1
g,next(); // 1
g.next(); // Exception: [object StopIteration]
こちらは function *
ではなくfunction
で宣言すれば使える。
違いとしては
- 次に実行する
yield
がなくなると例外が発生する - 返り値は値が返ってくるだけ
個人的にはES6のほうが好みなので改善?してよかったなぁと