2013-03-14 1 views
18

は、Haverbekeは(16ページ)と主張している:。Javascriptの関数オブジェクトまたはタイプですか?彼の<em>雄弁Javascriptを</em>で

「JavaScriptのシステムでは、このデータのほとんどはきちんと値と呼ばれるものに分離され、すべての値は、種類を決定タイプを持っています数値、文字列、ブール値、オブジェクト、関数、未定義の6つの基本型があります。

しかしJavaScriptでクロックフォード:良い部品は言う:

「JavaScriptの単純なタイプは、数値、文字列、(真と偽)ブール値、ヌル、と定義されていない他のすべての値がオブジェクトです。 JavaScriptでは、配列はオブジェクトであり、関数はオブジェクトであり、正規表現はオブジェクトであり、もちろん、配列はオブジェクトであり、メソッドはありません。 、オブジェクトはオブジェクトです。 "今

、少なくともV8の下で、私はこの取得:

> typeof function(){}; 
'function' 
> typeof {}; 
'object' 

をオブジェクトのタイプと機能であれば、私は理解していない機能やオブジェクトは両方のタイプであれば、オブジェクトですか。私は、プリミティブ型と他の種類の型(複合型?)の区別がないと思います。

+0

JS内のすべてがオブジェクトです。正方形が長方形であるというだけのことですが、長方形は正方形ではありません。 –

+1

@Derek:すべてではありません。 JSにはプリミティブ*(非オブジェクト)*があり、その中にはオブジェクト "ラッパー"がありますが、すべてではありません。 –

+0

関数を特別な型のオブジェクトと考えるのが最も簡単です。配列は特別な型のオブジェクトです彼らはオブジェクトの能力を持っていますが、それらを異なるタイプのオブジェクトにする他の能力も持っています。 – jfriend00

答えて

22

これはオブジェクトの一種です。 typeof

"function"です:彼らはしている

(function(){}) instanceof Function // true 

:彼らはFunctionコンストラクタのプロトタイプのインスタンスだ

({}).toString.call(function() {}) === "[object Function]" // true 

typeof (function() {}) === "function" // true 

内部[[Class]][object Function]です〜 Objectコンストラクタプロトタイプのインスタンス:

(function(){}) instanceof Object // true 
+0

+1。偉大な、簡潔な説明。 –

0

JavaScriptは関数型プログラミングをサポートしています。結果として、すべてのJavaScript関数はファーストクラスの関数であり、関数は通常のオブジェクトのように扱われます。

http://en.wikipedia.org/wiki/First-class_functions

+2

通常のオブジェクト( '{} 'など)と全く同じように扱われた場合、' typeof {}!== typeof function(){} 'はなぜですか? – icktoofay

+1

@ icktoofay- ECMA-262は['typeof'演算子](http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3)が何を返し、何らかのオブジェクトに対してTypeを返しません(NullはNull型ですが、 'typeof Null'は 'object'を返します)。 – RobG

+1

(私は実際にそれを答えに加えようとしていました - それは私が不思議に思っていたものではありませんでした) – icktoofay

5

あなたはjavascript内の型の話をするときに注意する必要があります。

  1. 未定義
  2. ヌル
  3. ブール
  4. 文字列
  5. オブジェクト強情

、値の設定値は、次のいずれかになりTypeを、持っていますtypeof operatorによって返された型ではない、それはstrですそれをINGのは、ほとんどの値のための型と同じですが、ために異なっている:

  1. nullを返します「オブジェクト」、その種類は[[Call]]リターン機能を実装するオブジェクト
  2. ヌルであるにも関わらず、でもそのタイプかかわらず、
  3. ホストオブジェクトは、彼らが制限された値の1

以外の好きなものを返すことができるオブジェクトであることだから、一番下の行は、関数の型がオブジェクトであるということですが、typeof someFn戻りfunction