ここ半年今まで以上に、MongoDBだったりFacebookAPI、JQueryを使っているので、JavaScriptにはまっています。IEでテストするとFirefox,Chromeで動いたコードが全く動かない駄々っ子ぷりに最後は怒りを覚えていましたが、最近はかわいくなってきました。そこで、ちゃんと標準規格であるECMAScriptも把握しておこうと思ってECMAScript勉強会に参加しました。完全に仕様厨による仕様厨のための勉強会でしたww
そこでメモってきたことを箇条書きにします。
最後になりましたが、主催した@kita_tさん、話してくれた@teramakoさん、@Constellationさんありがとうございました!!
ECMAScript Overview(@kita_tさん)
- オブジェクト → 0以上の属性を持つプロパティの集合
- 属性 → 書き込み可能、列挙可能などのプロパティの振る舞いを規定
- プロパティ → オブジェクト プリミティブ 関数の入れ物
- プリミティブ undefined, null boolean …
- 関数
- 呼び出し可能可能なオブジェクトの一種
- オブジェクトのプロパティとして関連付け
- Object
- Object , Boolean Number String, Function , Array , Math, Error…
- 組み込み型とオブジェクト型の違い。
- "hoge" → 組み込み型String
- new String("fuga") → Stringオブジェクト
- typeof "hoge" -> "string"
- typeof fuga -> "object"
- "hoge" === "hoge"; // true
- new String("hoge") === new String("hoge") ; // false インスタンスの同一性を見るため、falseになる。
- Stringとかのオブジェクト一般的に、newで生成することは稀。Google JavaScript Coding Style Guideではnew しないと規約されている。
- ラッパーオブジェクトのnew
- プリミティブに対して、メソッド呼び出しをするのは本来おかしい。
- が、やりたいので、やった時にラッパーオブジェクトに一瞬切り替わる。
- 内部エンジン的には切り替わってない
- プリミティブ string -> prototype -> Wrapperのメソッドをつかってやるが、これを入れておく場所が無いので(プリミティブであるため)消えてしまう。
- プロパティをを持てるのはオブジェクトだ、という縛りを抜け出したかった?
- 言語仕様上の一貫性。
- プリミティブに対して、メソッド呼び出しをするのは本来おかしい。
- globalオブジェクト
- スクリプトが実行される前に生成されるオブジェクトで唯一のもの。
- webブラウザではglobalオブジェクトのwindowプロパティがそれにあたる
- オブジェクト
- ECMAScriptではクラスを使用しない。
- 代わりにリテラル記法やコンストラクタを使った様々なオブジェクト生成方法が提供
- [] ; // Array {} ; // Object
- コンストラクタ
- prototypeプロパティを持つ関数
ES.next追っかけ(@teramakoさん)
- MLを追いかける。ただし量が多いので注意。
- ECMAScript Syntax Grammar 6th Edition / Draft にドラフト版の構文をまとめてる。使ってる人が徐々に増えてる??
- SpiderMonkeyのHarmony実装をトラッキングするメタバグがある.
ES.next the corner cases(@Constellationさん)
- ConstDelcation
const V = 20; V = 30 ; // SyntaxErrorになる。
- ES.next Library extendsion
- String,Number,Mathに機能を増やそう。
- StringにstartWith,contains,toArrayとか。
- propertyのfor-inや、Object.keyなどの登場順が規定された。
-
- ※ 個人的にはこれらはかなり嬉しい。使用頻度がかなり高いので。
-
- String,Number,Mathに機能を増やそう。
- これまではnew Date(NaN).toString()の仕様は規定されていなかったが、"Invalid Date"を返すように規定された。*1
ECMAScript読書会
- fff系の文字系をUpperCaseするとFFFになり、文字数3倍となる。
- "\uFB00" == "ff" は "\uFB00".toUpperCase() == "FF"となるべき*2
- StrictMode*3
- 最後にuse strict; と書くと、最初の方のパースにも戻ってstrictが適用される。頭から解析していくときに別の場所(メモリ空間?)にどけておくみたい。
- きちんと書けば少しは処理が軽くなる?(@kita_tさん) → 誤差程度(@Constellationさん)
- 関数の中にuse strict;と書いた場合、関数の引数は適用されるの?
- 関数の引数も適用対象。関数名自体も適用対象となる。
- 最後にuse strict; と書くと、最初の方のパースにも戻ってstrictが適用される。頭から解析していくときに別の場所(メモリ空間?)にどけておくみたい。
クロージング(@kita_tさん)
- 次回は5月中旬
- 他の仕様書を読む勉強会。HTTPとかDartとかもやりたい。RFCとか。
参考
*1:Google Chrome,Firefoxの最新は現在も"Invalid Date"を返す。
*2: Google Chromeで確認するとこの通りになっていた。FireFoxはtoUpperCase()が実装されていない。新しいJavaScriptエンジンでも実装の違いがあってびっくり。
*3:IEはIE10からサポートされる予定なので、まだ開発時には使えないことが悲しいなぁ。http://msdn.microsoft.com/en-us/library/br230269(v=vs.94).aspx