ECMAScript勉強会 アウトラインメモ
ECMAScript勉強会 に参加してきたのでその時のメモです。
久々に結構難しい内容が多かった気がする。
ECMAScript勉強会
ECMAScript概要 – rika_t
途中参加
newがあるのはなぜ
プリミティブな型もメソッドやプロパティを持てるようにしたいため、ラッパーでラップしてた。
globalオブジェクト
globalオブジェクトは必ずしもwindowではない
オブジェクトとクラス
内部的には[[Class]]というクラスという文字列がでてきてた。
- ES6から内部的にClassというものがなくなってきてる。
- リテラル記法やコンストラクタを使って様々なオブジェクトを表現してる
-
NativeBrand
という名前になってる
prototype
- 仕様書にのってるprototypeの図はわかりにくい
変数宣言
- “var”キーワードの後にIdentifierを与える
- opt = option としてInitiliser = “str”みたいに初期化も同時にできる
-
IdentifierName
- IdentifierStart (変数名の最初に文字列) か初めて
- IdentifierName IdentifierPart
- let から始まる内容はここで定義してる内容をかかれてる(他を見なくてもいい)
変数宣言の処理
- return (normal,empty,empty) normalは正常終了
ES.next 追っかけ – teramako
メーリングリストの購読
- es-discussの購読
- ES.nextに追うため見るメーリングリスト
- 流量が多い
構文抽出
- wiki.ecmascript.org に最新版のドラフトがアップロードされる
- 更新内容は色分け表示されてる
- ドラフト仕様から構文部分のみ抽出したものを作成
Mozillaの実装追いかけ
*SpiderMonkeyのHarmony実装をトラッキングするメタバグがある
構文解析
JavaScriptがどうやって構文解析していくか
- Reflect.parse()メソッド
- 結果をオブジェクトのツリーで返してくれる
- reflect.jsmを読み込んでReflect.parseが利用できる
iv/js
- ES.nextの実装をパースできるツール
- http://constellation.github.com/iv/js/es.next.html
- esprimaを使ったものも最近でてきた
- http://esprima.org/demo/parse.html
quasiリテラル
- ヒアドキュメント的に使えそう
ES.next the corner case – Constellation
-
esprima
- コミッターやってる
ConstDeclarationの話
- initializer必須
- Blockスコープ
- BNFだけでは判断できないで、semaniticsも見ないと行けないようになった *
block scope
- staticに解析可能
- ブロックスコープになったことで、ランタイムでないと判定できなかったのが、静的に解析が可能
-
そのため速度がかなりよくなった
-
再代入はsyntax errorにする
-
これもパース時に判断できるので、速度がよくなる
<p style="margin-top: 1em; margin-right: 0px; margin-bottom: 1em; margin-left: 0px; line-height: 1.5em; padding: 0px;"> const V = 20; V = 30;// syntax error </p>
-
early errorに分類(run timeより前)
egal operator
- is
- isnt
- より値の同一性に重きをおいたequal
- is/isnt はContextual Keyword
-
Statementの先頭以外にくるキーワードはcontextual Keywordになる事が殆ど
- ofとか
- 文脈依存のキーワードのような扱い方をされるということ
<| operator トライアングル演算子
- 常にArrayを継承できる
-
<|
の右はリテラルしか置けない -
なぜリテラルのみ
- JITとかに破壊的になってしまう
- inline cacheが破壊されて、キャシュが機能しない
-
右側にfunctionリテラルときは挙動が変わる
- 継承っぽくなる
- Base.prototypeを[[Prototype]]にもつObjectが生成されて、インスタンスのprototypeに設定される
- ECMAScript と OOP パラダイム、それに ES.next の議論中 OOP 周りのシンタックス – oogattaの勉強日記
ES.next Library Extension
-
String/Number/Function などに機能を増やす
- repeat
- startsWith
- などの便利な関数
-
GlobalなものをNumberにいける
- isFinite
- parseInt などをNumberにも追加する
duplicateな変数purge機構
- 関数スコープのレキシカルスコープ内で変数宣言が被った時にsyntax errorになる
new Date(NaN)
- ES.nextのnew Date(NaN).toString() Invalid Dateをかえすようになった
propertyの登場順
- for-in , Object.keysなどの登場順が規定される
LHS
- left hand side
- 今まで()でくくって中が式なら何でも入ってた
- それがleft hand side expressionという部類のみになった
(1,2,3) = 20;
というのがSyntaxErrorになる(ES5はReferrenceErrorなった) またパース時に判断できる
ES.nextのバグ
- draftにはバグある
({responseText }) = res;
そもそもオブジェクトリテラルの解釈
名前
-
ES.next
- バージョン番号がアレなので.nextという名前になってる
-
strawman(ストローマン)
- とりあえずな感じのバージョン
-
Harmony
- いずれかのバージョンにはいるかも的なもの
A brief history of ECMAScript versions (including Harmony and ES.next)
CoffeeScript
- is/isnt みたいにセマンティックが同じなのに、挙動が違うことで論争が起きるのが怖い
- => とかでも論争がおきてる
ECMAScript読書会
- 6章からが本番
- Annexに定義などが入ってる
- Annex C はStrict mode
- D, Eが変更点修正点
4.概要
-
この仕様では外部データの入力や計算結果の出力に関する規定はありません
- 仕様外だが他にもオブジェクトがあるかもしれない事は考慮する(DOM)
4.2.2 Strict mode
- “ECMAScriptは、言語において使えるいくつかの機能の使い方を制限したいと考えているユーザがいる可能性があることを認識しています。”
- 標準のものに追加してエラー条件が定義される
-
実装中の注意
- パース時にでるエラーと実行時エラー
- パース時に出すエラーはパース時にstrict modeかどうかをみないといけない
-
関数の先頭にstringリテラルが連続してる == ディレクティブ プロローグ という
- この範囲にuse strictが入っていればstrict modeになる
<li style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding: 0px;"> ディレクティブ プロローグの最後に”use strict”;を書かれた場合などは、最初のほうのパースにもstrictを適応してエラーにする </li> <li style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding: 0px;"> 関数の引数はどっち(中、外)のstrict modeなのか? <ul style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 2em; padding: 0px;"> <li style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding: 0px;"> 中のstrict modeが適応されるので、関数内がstrict modeなら、関数名にevalとかしてる時もエラーにするようにする(disccuss) </li> <li style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding: 0px;"> body,param,functionName 全部strict modeに適応範囲とする </li> </ul> </li> <li style="margin-top: 0.5em; margin-right: 0px; margin-bottom: 0.5em; margin-left: 0px; padding: 0px;"> <a style="color: #4183c4; text-decoration: none; padding: 0px; margin: 0px;" title="Does 'use strict' in a FunctionBody apply strict mode FutureReservedWord restrictions to function name or arguments?" href="https://mail.mozilla.org/pipermail/es5-discuss/2011-January/003904.html">Does ‘use strict’ in a FunctionBody apply strict mode FutureReservedWord restrictions to function name or arguments?</a> </li> </ul>
メモ: Mou + github.css
お知らせ欄
JavaScript Primerの書籍版がAmazonで購入できます。
JavaScriptに関する最新情報は週一でJSer.infoを更新しています。
GitHub Sponsorsでの支援を募集しています。