js 數據類型檢測

       提起數據類型檢測  大多數人首先想起的應該是  typeof 'xxx' == '數據類型' 坦然這種方法對於基本數據類型的檢測仍是很是方便的,可是當遇到引用數據類型 Object時卻心有餘而力不足,下面就來說講這些數據類型的檢測方法吧
  
數組

  1.使用typeof方法
this

    首先咱們來看看下面的示例將會在控制檯打印出什麼spa

//檢測方法                                    //輸出類型  
typeof
function(){} ====> ‘functiontypeof "" ====> '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]」
相關文章
相關標籤/搜索