提起數據類型檢測 大多數人首先想起的應該是 typeof 'xxx' == '數據類型' 坦然這種方法對於基本數據類型的檢測仍是很是方便的,可是當遇到引用數據類型 Object時卻心有餘而力不足,下面就來說講這些數據類型的檢測方法吧
數組
1.使用typeof方法
this
首先咱們來看看下面的示例將會在控制檯打印出什麼spa
//檢測方法 //輸出類型
typeof function(){} ====> ‘function’ typeof "" ====> 'string' typeof 545 ====> 'number' typeof null ====> 'object'
typeof true ====> 'boolean' typeof undefined ====> 'undefined' typeof [] ====> 'object' typeof {} ====> 'object'
typeof Symbol() ====> 'symbol'
在上面的示例中咱們能夠明確看出使用 typeof 來作類型檢測時就出現上文說起的缺陷 沒法檢測出 數組 null 等數據類型,至於爲何null做爲基本數據類型爲啥也會被typeof檢測成object(這就是js的歷史遺留問題了) -- JavaScript 最初的實現中,JavaScript 中的值是由一個表示類型的標籤和實際數據值表示的。對象的類型標籤是 0。因爲 null
表明的是空指針(大多數平臺下值爲 0x00),所以,null的類型標籤也成爲了 0,typeof null
就錯誤的返回了"object"
,因此 typeof方法做爲基本數據類型除 null 以外的簡單數據類型判斷仍是一種不錯的方案prototype
2. 使用instanceof方法判斷數據類型指針
先說下 instanceof 主要時用來幹嗎的吧 在mdn官網咱們能夠看到關於 instanceof 的解釋
instanceof
運算符用來檢測 constructor.prototype
是否存在於參數 object
的原型鏈上,也就是說只要原型鏈上的constructor 對象下的prototype的值是對象類型仍是數組類型(原理上是遍歷原型鏈判斷)
如圖:
數組----- 對象----
code
因此能夠知道,該方法用來判斷引用類型下的對象具體類型是不錯的一種方法,這種方法在判斷除了Function 的基本類型 以外 所有會返回false,其中 function 的原型鏈上也是繼承至object,因此 function instanceof Object 也是返回true 的 便可以用來判斷除 object自己判斷以外的引用類型,以及function基本類型 ,和原型繼承下來的方法均可以判斷出來對象
[] instanceof Array ====> true [] instanceof object ====> true ({}) instanceof Array ====> false '1324' instanceof String ====> false (function(){}) instanceof Function ====> true 2313 instanceof Number ====> false
function test(ang) { this.a = ang; } var mytest = new test("Honda"); var a = mytest instanceof Car; ====> true
3.使用 Object.prototype.toString.call() 方法 目前來講這個應該算是萬金油類型的能知足大多數判斷(固然覺得該方法基於原型 若是原型上的toString被修改 這方法天然也就不許了),blog
固然這方法是沒法判斷除原型上的繼承實例的 如要判斷需使用 instanceof 方法
繼承
Object.prototype.toString.call(null); =======> 」[object Null]」
Object.prototype.toString.call(undefined); =======> 」[object Undefined]」
Object.prototype.toString.call(「abc」); =======> 」[object String]」
Object.prototype.toString.call(123); =======> 」[object Number]」
Object.prototype.toString.call(true); =======> 」[object Boolean]」
Object.prototype.toString.call(function); =======> 」[object Function]」
Object.prototype.toString.call([]); =======> 」[object Array]」
Object.prototype.toString.call({}); =======> 」[object Object]」