最近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のほうが好みなので改善?してよかったなぁと