KMC活動ブログ

京大マイコンクラブの活動の様子を紹介します!!

ECMAScript6勉強会 第13回 【KMCアドベントカレンダー3日目】

この記事はKMC Advent Calendar 2014の3日目の記事です。

ECMAScript6勉強会

こんにちは id:tyage です。

KMCでは6月からゆっくりとECMAScript6の仕様を読み進める勉強会をしています。

過去の記事を以下に挙げておきます。

第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と書かれていました。

f:id:kmc-log:20141203185809p:plain

どうやらgeneratorのインスタンスからそのgeneratorへはアクセスできないようです。

console.log((new function *() {yield 1}).constructor) // => GeneratorFunctionPrototype

補足

そういえばgeneratorでthisをgeneratorのインスタンスとして使用するのは気をつけたほうがよさそうです。

Retrieving generator references

String.prototype.normalize

文字列をUnicode正規化できるメソッドです。

引数に正規化形式(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ページを御覧ください。

入部案内 — 京大マイコンクラブ (KMC)