2013-03-14 71 views
18

在他雄辯的Javascript,Haverbeke聲稱(第16頁)。Javascript中的函數是對象還是類型?

「在JavaScript系統中,大多數這些數據都被整齊地分成東西叫做值的每個值都有一個類型,它決定了樣它有六種基本類型的值:數字,字符串,布爾值,對象,函數和未定義的值。「

但克羅克福德在的Javascript:好的部分說:

「簡單類型的JavaScript是數字,字符串,布爾值(true和false),null和未定義的所有其他值都是對象數字,字符串和布爾類似於對象,因爲它們有方法,但是它們是不可變的,JavaScript中的對象是可變鍵控集合,在JavaScript中,數組是對象,函數是對象,正則表達式是對象,當然, ,對象是對象。「

現在,至少在V8我得到這個:

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

如果對象是一個類型,函數是一個對象,如果功能和對象是兩種類型的,我不明白。我想我錯過了原始類型和其他類型(複合類型?)之間的區別。

+0

JS中的一切都是一個對象。這就像說一個正方形是一個矩形,但是一個矩形不是正方形。 – 2013-03-14 02:11:22

+1

@德里克:不是一切。 JS具有原語*(非對象)*,並且其中一些具有對象「包裝器」,但不是全部。 – 2013-03-14 02:19:09

+0

把函數想象成一種特殊類型的對象是最容易的,就像數組是一種特殊類型的對象一樣。他們具有對象的能力,但也有其他能力,使他們成爲不同類型的對象。 – jfriend00 2013-03-14 02:25:16

回答

22

它們是一種對象。

typeof"function"

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

內部[[Class]][object Function]

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

他們是Function構造函數原型的一個實例:

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

他們一個Object構造函數原型實例:

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

+1。偉大,簡潔的解釋。 – 2013-03-14 02:12:21

0

JavaScript支持函數式編程。因此,所有的JavaScript函數都是一流的函數,這意味着函數被視爲普通對象。

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

+2

如果它們像普通對象一樣被完全對待(例如'{}'),那麼爲什麼要使用typeof {}!== typeof function(){}'? – icktoofay 2013-03-14 02:19:07

+1

@ icktoofay - 因爲ECMA-262定義['typeof'運算符](http://www.ecma-international.org/ecma-262/5.1/#sec-11.4.3)返回的內容,對於某些對象不返回類型(例如,Null是空類型,但'typeof Null'返回'對象')。 – RobG 2013-03-14 02:49:21

+1

(我實際上是在試圖讓他們將其添加到答案中 - 這實際上並不是我想知道的。) – icktoofay 2013-03-14 03:06:25

5

您需要談論的JavaScript類型時要小心。值具有Type,其可以是下列之一:

  1. 未定義
  2. 布爾
  3. 字符串
  4. 對象

事與願違,該值由typeof operator返回的不是Type,它是一個str荷蘭國際集團是同類型的最值,但不同的是用於:

  1. 返回NULL「對象」,儘管它的型號是空
  2. 實現[[Call]]回報功能,即使它的類型的對象爲對象
  3. 主機對象可以返回任何他們喜歡比限制值

的另一個因此,底線就是函數的類型是Object,但typeof someFn回報function

相關問題