2017-02-16 74 views
3

typeof運算符我來到下表其狀態的對象的內部[[Class]]屬性及其相應的值,該typeof運營商的回報跨越。瞭解在Javascript

Value    Class  Type 
------------------------------------- 
"foo"    String  string 
new String("foo") String  object 
1.2     Number  number 
new Number(1.2)  Number  object 
true    Boolean boolean 
new Boolean(true) Boolean object 
new Date()   Date  object 
new Error()   Error  object 
[1,2,3]    Array  object 
new Array(1, 2, 3) Array  object 
new Function("") Function function 
/abc/g    RegExp  object (function in Nitro/V8) 
new RegExp("meow") RegExp  object (function in Nitro/V8) 
{}     Object  object 
new Object()  Object  object 

這裏要注意的一件事是typeof正確返回Javascript中關聯的原始數據類型。

然而,它返回一個object類型從Array.prototype繼承的陣列,但返回function型爲從Function.prototype繼承的功能。由於一切都是Javascript中的對象(包括數組,函數&原始數據類型對象),我發現typeof運算符的這種行爲非常不一致。

有人可以扔在typeof操作在現實中是如何工作的一些輕?

+0

您應該考慮** instanceof **處理對象時https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/instanceof – ymz

+0

只有某些類型具有特定的結果。每個其他類型都被視爲一個對象。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/typeof – Armin

+0

如果typeof返回所有對象的'object',因爲所有東西都是javascript中的對象,那麼它就完全沒用了。 –

回答

2

這是有點奇怪,特殊的Javascript行爲。它是從Javascript最早的日子繼承而來的,今天可能不會以這種方式編寫。

儘管如此,我們在哪裏,我們都使用Javascript,所以我們必須對付它!

的事情是,在Javascript中值不是對象或他們是原語。這是一個設計決定。他們不能成爲別的。 The types of primitives are

  • 數字
  • 布爾
  • 符號(從ES2015)
  • 特殊值undefined
  • 特殊值null(對於該typeof也返回object

任何事情都是一個對象。這是設計。數組是對象,所以typeof返回object,與其他每個不可調用的對象(即函數)一樣。見the spec for typeof

最好的問題是詢問爲什麼你想測試一下是否有數組。你可能不需要,特別是像數組類似的對象,比如NodeLists不是數組,但是在很多方面都是這樣的。

最好的解決方案在大多數情況下是調用Array.from的價值提供:那麼你知道它是一個數組。

+0

爲了測試一個數組,我寧願使用'Array.isArray()'或'instanceof'。只是想知道爲什麼返回類型的函數和數組的異常。 – nashcheez

+0

@nashcheez答案是數組不是基元的歷史決定。 – lonesomeday