ECMAScriptの内部のパラメータたち
JSについてあまり詳しくないので、以下の記事が面白かった。
v8.dev
レキシカル環境とか、プロパティーディスクリプタとか、環境レコードとか、JSのspecにだけ登場する型の解説はここにある。
https://tc39.es/ecma262/#sec-ecmascript-specification-types
spec用に定義された抽象操作という関数がある。
https://tc39.es/ecma262/#sec-abstract-operations
[[]] で囲まれているのは内部スロットもしくは内部メソッドというもの。
内部スロットはJSオブジェクトか特定の方のデータメンバのことで、オブジェクトの状態を格納するのに使われる。
内部メソッドはJSオブジェクトのメンバである。
例えばJSオブジェクトは[[Prototype]]
の内部スロットと、[[GetOwnProperty]]
の内部メソッドを持っている。
しかしこれらはJSからアクセスすることができない。
たまに、内部メソッドは、似たような名前の抽象操作にいろいろとデリゲートする。
例えばordinaryオブジェクトの[[GetOwnProperty]]
は[[GetOwnProperty]](P)
をつかう。
[[GetOwnProperty]](P)
は説明をみると、Return ! OrdinaryGetOwnProperty(O, P)
って書いてあるんだけど、このOrdinaryGetOwnPropertyは内部メソッドじゃない。オブジェクトに関連づいているわけじゃないので。
操作対象のオブジェクトがパラメータとして渡される。
ECMAScriptのオブジェクトにはordinaryオブジェクトとexioticオブジェクトがある。
ordinaryオブジェクトは、必須内部メソッド(essential internal methods)と呼ばれる、デフォルトの挙動のセットを持っている。
https://tc39.es/ecma262/#table-5
デフォルトの挙動から逸れるものはexioticオブジェクトである。
一番有名なexioticオブジェクトはArray。lengthプロパティのところがデフォルトじゃない。
ECMAの挙動説明のところは(!や?が書いてある)、完了レコードの記述である。
完了レコードには3つのフィールドがある
[[Type]]
- normal、break、continue、return、throwのいずれかがはいる。normal以外は abrupt completions といわれる
[[Value]]
- 関数の戻り値や例外など、完了時に生成される値
[[Target]]
- directed control transfers につかうとか
全ての抽象操作で暗黙的に完了レコードが返される。戻り値がBooleanのときでも、型がnormalの完了レコードにラップされている。
※ ただし、完了レコードから値を抽出するのではなく、そのままの値を返すヘルパー関数などもある
たとえばあるアルゴリズムが例外をスローするとき、完了レコードの[[Type]]
はthrowであり、[[Value]]
は例外オブジェクトになる。
https://tc39.es/ecma262/#sec-completion-record-specification-type
ReturnIfAbrupt(argument) というのがあるんだけど、これは、
abrupt completion のときは引数を返し、そうでなければ完了レコードから値を出してくるもの。
https://tc39.es/ecma262/#sec-returnifabrupt
そして!や?の説明はここにある。
https://tc39.es/ecma262/#sec-returnifabrupt-shorthands
この記事は連載ものっぽい。また気が向けば続きをチェックする。