Hatena::Groupjavascript

JavaScriptで遊ぶよ

 | 

2010-02-09

typeof arguments === ?

01:26

ちなみに ECMAScript 5 だと typeof arguments === ”arguments” となるらしい. ややこしい.

%22Javascript quiz %22 解答と解説 - リタマス

↑と僕の発言にリンクされてて、あやふやなことを言うべきじゃなかったと反省。反省の意味を込めて調べてみました。


ECMAScript5 の仕様の60ページ目を見ると、arguments オブジェクトを作るアルゴリズムのところに

4. Set the Class internal property of obj to "Arguments".

と書いてあります。

このことから僕は typeof arguments === ”arguments” になるのだと思っていました。


次に71ページの typeof 演算子のところを見ます。(注、[ ← を二つ重ねるとはてな記法でおかしなことになっちゃうので間を空けて書いてます)

Type of valResult
Undefined"undefined"
Null"object"
Boolean"boolean"
Number"number"
String"string"
Object (native and does not implement [ [Call] ])"object"
Object (native or host and does implement [ [Call] ])"function"
Object (host and does not implement [ [Call] ])Implementation-defined except may not be "undefined", "boolean", "number", or "string"

これを見ると、arguments は [ [Call] ] 内部メソッドを持たないので、"Object (native and does not implement [ [Call] ])" か "Object (host and does not implement [ [Call] ])" のどちらかということになります。

後者の場合は Implementation-defined なので、arguments もありかもしれません。


次に、仕様の5ページを見ると、native object とか host object について書いてあります。そのあたりを引用します。

4.3.6

native object

object in an ECMAScript implementation whose semantics are fully defined by this specification rather than by the host environment.

NOTE Standard native objects are defined in this specification. Some native objects are built-in; others may be constructed during the course of execution of an ECMAScript program.

4.3.7

built-in object

object supplied by an ECMAScript implementation, independent of the host environment, that is present at the start of the execution of an ECMAScript program.

NOTE Standard built-in objects are defined in this specification, and an ECMAScript implementation may specify and define others. Every built-in object is a native object. A built-in constructor is a built-in object that is also a constructor.

4.3.8

host object

object supplied by the host environment to complete the execution environment of ECMAScript.

NOTE Any object that is not native is a host object.

どうやら arguments は native object のようです。(仕様の中に章があって挙動が定義されているから)


というわけで、ECMAScript5 でも typeof arguments === 'object' になるっぽいです。

適当なこと言ってごめんなさい。


(もちろん上に書いた推測が間違ってる可能性もありますが)

トラックバック - http://javascript.g.hatena.ne.jp/edvakf/20100209
 |