2016-09-13 26 views
3

這裏是一個函數,其數據類型的一個簡單的例子:JavaScript的數據類型功能的有效性

代碼段:

function hello(){ 
    console.log("hello"); 
} 
console.log(typeof(hello)); //function 

查詢:

在JavaScript這些是數據類型:

1. Object 
2. Primitives - String, number, boolean, null, undefined, symbol(ECMA6) 

當沒有名爲'函數'的數據類型時,我如何獲取數據類型爲函數(雖然在邏輯上是正確的)。另外,在文本上寫入函數的數據類型是對象。所以,我必須得到結果爲對象

有人可以澄清這種困惑嗎?

+0

[__typeof運算符返回一個字符串,指示未評估操作數的類型.__](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Operators/typeof),不是真的'數據類型' – Rayon

+0

因爲'「function」'是規範說的返回? (這是有道理的,而'typeof null'返回'「object」')。 – nnnnnn

+0

是的這兩種情況都是令人困惑的。還有,除了typeof之外,還有其他方法來測試一個變量的數據類型 - 因爲它返回spec或者表示未評估操作數的類型? (根據上述2條評論) – Deadpool

回答

4

是的,你是對的,沒有function類型,它只是在typeof運算符的一個破解,它返回"function"爲可調用的對象。

參考:http://www.ecma-international.org/ecma-262/6.0/#sec-typeof-operator

一般來說,typeof不會返回實際的類型名稱,但有兩個例外:

  • typeof null回報object,但null類型是Null
  • typeof <func>回報function,但是<func>的類型是Object
+0

這意味着正確的答案應該只是對象,但在目前的情況下,由於某些規範 - 「它是給函數」,但實際上它應該是「對象」? – Deadpool

+0

@Peterson:是的,查看更新 – georg

+0

另外,在例外列表中添加typeof(Nan)===「number」! – Deadpool

2

從「你不知道JS書」,由凱爾·辛普森:

那麼什麼是第七字符串值的typeof可以返回?

typeof function a(){ /* .. */ } === "function"; // true 

人們很容易想到 該功能將是一個頂級的內置型的JS,尤其是 給出typeof運算符的這種行爲。然而,如果你閱讀 規範,你會發現它實際上有些是對象的「子類型」。 具體來說,一個函數被稱爲「可調用對象」 - 一個 對象,該對象具有一個內部[[Call]]屬性,允許調用它的值爲 。

它是用來區分「可調用」對象和「不可調用」對象。

+0

看到這個,我相信函數應該是一個數據類型本身,或者至少不是返回函數--- typeof返回應該是「可調用對象」 - 這會更好理解! – Deadpool

+0

函數有一些對象行爲 - 它有原型,屬性(如「長度」 - 參數數量,「名稱」等)和方法(包括特定於對象的「toString」,「valueOf」),這可能是原因爲什麼他們是對象的子類型而不是單獨的類型。 「功能」這個詞很可能用於避免來自其他語言的人混淆。 – EternalLight