この記事はKMC Advent Calendar 2014の3日目の記事です。
ECMAScript6勉強会
こんにちは id:tyage です。
KMCでは6月からゆっくりとECMAScript6の仕様を読み進める勉強会をしています。
過去の記事を以下に挙げておきます。
- ECMAScript6勉強会 第1回・第2回 - KMC活動ブログ
- ECMAScript6勉強会 第3回 - KMC活動ブログ
- ECMAScript6勉強会 第4回 - KMC活動ブログ
- ECMAScript6勉強会 第5回 - KMC活動ブログ
- ECMAScript6勉強会 第1回・第2回 - KMC活動ブログ
- ECMAScript6勉強会 第6回・第7回 - KMC活動ブログ
- ECMAScript6勉強会 第8回・第9回・第10回 - KMC活動ブログ
- ECMAScript6勉強会 第11回 - KMC活動ブログ
- ECMAScript6勉強会 第12回 - KMC活動ブログ
第13回
10/20に第13回を行いました。
この回では generators (yield), String.prototype.normalize, String.prototype.startsWith, String.prototype.endsWith, String.prototype.contains を読みました。
generators (yield)
generatorはES6で入った目玉となる機能の一つですね。
これを使ったライブラリとして、非同期処理の制御に使えるcoなんかは有名ですね。
generatorはiteratorを生成する役割を持った関数なのですが、関数の途中で処理を中断・再開ができるコルーチンのような役割も持ちます。
pythonのgeneratorに影響を受けていると思われます。
基本
基本的には以下のようにiteratorを生成することができます。
function* gen() { yield 2; yield 3; } gen2 = function* () {} iter = gen() for (b of iter) { console.log(b) }
generator method
また、オブジェクトやクラスに対してgenerator methodを定義することも可能です。
obj = { * a(){ yield 1; yield 2; } }; iter = obj.a() for (b of iter) { console.log(b) }
yield *
yield
ではなくyield *
として配列や文字列などのiterableなobjectを渡した場合は、それをiteratorとして返します。
a = function*() { var array = [1,2,3] yield * array }() for (b of a) { console.log(b) }
return, throw
また、return, throwメソッドが用意されており、return, throwメソッドを呼ぶとそこでiteratorを終了することができます。
throwはFirefox34などでも実装されていますが、まだreturnが実装されている環境は少なさそうです。
a = function*() { yield 1 yield 2 }() console.log(a.next()) a.throw(new Error('stop it')) console.log(a.next())
generator instance
仕様には以下の様な図が添付されており、generator instance does not expose access to its generator function
と書かれていました。
どうやらgeneratorのインスタンスからそのgeneratorへはアクセスできないようです。
console.log((new function *() {yield 1}).constructor) // => GeneratorFunctionPrototype
補足
そういえばgeneratorでthisをgeneratorのインスタンスとして使用するのは気をつけたほうがよさそうです。
Retrieving generator references
String.prototype.normalize
引数に正規化形式(NFD, NFC, NFKD, NFKC)を渡せます。
半角カナを全角カナにしたり
unescape(escape('タ'.normalize('NFKC'))) // => タ
濁点をとったり
'が'.normalize('NFKD')[0] // => か
圧縮文字を分解したりと思ったよりも便利です。
unescape(escape('㌕'.normalize('NFKC'))) // => キログラム
String.prototype.startsWith, String.prototype.endsWith, String.prototype.contains
それぞれ第一引数をsearchStringとして、第二引数をpositionとして受け取ります。
文字列がsearchStringから始まるか、searchStringで終わるか、searchStringを含むかを返す関数です
'123456789'.startsWith('345', 2) // => true '123456789'.endsWith('567', 7) // => true '123456789'.contains('345', 2) // => true
startsWith, containsの場合はpositionを先頭からの位置として受け取ります。(デフォルトは0)
endsWithの場合は末尾からの位置として受け取ります(デフォルトは文字列の長さ)
ECMAScript6勉強会次回予告
次回は14回(10/27)になります。
内容は Object.is, Object.getOwnPropertySymbols, Object.setPrototypeOf, Array.of, Array.prototype.copyWithin, Array.prototype.keys, Array.prototype.values, Array.prototype.entries, Array.prototype[Symbol.unscopables], function "name" property です
アドベントカレンダー次回予告
明日はhidesysさんの記事です。
楽しみです。
KMCM
KMCこと京大マイコンクラブでは、ECMAScriptになりたい部員を募集しています。KMCには入部制限はありません。年齢や学歴、人種、宗教、信条、性別、社会的身分、門地、国籍、経験などは不問です。また活動に関する制約もありません。IRCのチャット越しに会話に参加することだけでも大丈夫です。詳細は下記Webページを御覧ください。