JavaScript基本數據類型有5種:字符串、數字、布爾、null、undefined。 用戶定義的類型(object)并沒有類的聲明,因此繼承關系只能通過構造函數和原型鏈來檢查。 本文要解決的問題,如何檢查一個變量的類型?先給結論:

如果你要判斷的是基本數據類型或JavaScript內置對象,使用toString; 如果要判斷的時自定義類型,請使用instanceof。

不同的編程語言都有自己的方式來提供類型信息,例如C#的反射、C++的Traits, JavaScript提供類型信息的方式更加靈活,因而也容易產生很多誤用。 下面來分析常見類型檢查手段的區別:typeof, instanceof, constructor, toString。

typeof

typeof 操作符返回的是類型字符串,它的返回值有6種取值:

typeof 3 // "number"
typeof "abc" // "string"
typeof {} // "object"
typeof true // "boolean"
typeof undefined // "undefined"
typeof function(){} // "function"
所有對象的typeof都是"object",不能用于檢測用戶自定義類型。 比如Date, RegExp, Array, DOM Element的類型都是"object":

typeof []   // "object"
typeof還有一個知名的bug:

typeof null     // "object"
null是基本數據類型,它的類型顯然是Null。其實這也反映了null的語義, 它是一個空指針表示對象為空,而undefined才表示什么都沒有。 總之,typeof只能用于基本數據類型檢測,對于null還有Bug。