js專題之類型判斷


在ES6以前,javascript有6種基本的數據類型:主要分為5種原始類型和1種引用類型。(bigint ,symbol 此處暫不處理)

原始類型:Boolean、Number、String、Undefined、Null、

引用類型:Object

原始類型,它們的值只包含一個單獨的內容,存放在棧中;

引用類型用於存儲數據集合或更復雜的實體,存放在堆中,在棧中會存放一個指針,指向堆中的地址;引用類型除 Object 外,還包括 Function 、Array、RegExp、Date 等等。

類型的多樣型,使得js的類型判斷也存在多種方法,以下就常用的幾種介紹:

1.typeof

typeof是最常用的類型判斷方法:Boolean、Number、String、Undefined、Null、Object、Function
采用typeof判斷出來的類型對應關系分別為:boolean、number、string、undefined、object、object、function。可以看出除了null跟object其他的均能判斷出正確的類型
 
2.instanceof
用來判斷 a 是否為 b 的實例,寫法為 a  instanceof b; 是則返回true,否則返回false
 
3.constructor
每一個對象實例都可以通過constructor訪問其構造函數,因此可以通過constructor判斷一些引用類型的數據類型:
    var obj = {a: 1}      
    var array = [1, 2, 3];  
    var date = new Date();  
    var error = new Error(); 
    var reg = /a/g;         
    var func = function a(){}; 
    
    console.log(obj.constructor === Object) // true
    console.log(array.constructor === Array) // true
    console.log(date.constructor === Date) // true
    console.log(error.constructor === Error) // true
    console.log(reg.constructor === RegExp) // true
    console.log(func.constructor === Function) // true

4.Object.prototype.toString

話不多說,先上代碼:

    var number = 1;          // [object Number]
    var string = '123';      // [object String]
    var boolean = true;      // [object Boolean]
    var und = undefined;     // [object Undefined]
    var nul = null;          // [object Null]
    var obj = {a: 1}         // [object Object]
    var array = [1, 2, 3];   // [object Array]
    var date = new Date();   // [object Date]
    var error = new Error(); // [object Error]
    var reg = /a/g;          // [object RegExp]
    var func = function a(){}; // [object Function]

    let tostring = Object.prototype.toString
    console.log(tostring.call(1))
    console.log(tostring.call('123'))
    console.log(tostring.call(true))
    console.log(tostring.call(null))
    console.log(tostring.call(undefined))
    console.log(tostring.call({}))    
    console.log(tostring.call(new Date))
    console.log(tostring.call(new Array))
    console.log(tostring.call(new Error))
    console.log(tostring.call(a))
    console.log(tostring.call(/a/g))
View Code

通過如上代碼,是不是發現通過調用 Object.prototype.toString 會返回一個由 "[object " 和 class 和 "]" 組成的字符串,而 class 是要判斷的對象的內部屬性。

於是,結合typeof封裝了一個type方法,可以快速判斷出數據類型的公共方法:

    function type(param) {
      // es6中null的類型為object
      if(param === null){
        return param+''
      }
      if(typeof param === 'object'){        
        let val = Object.prototype.toString.call(param).split(' ')[1]
        let type = val.substr(0,val.length-1).toLowerCase()
        return type
      }else {
        return typeof param
      }
    }

    console.log(type(number)) // number
    console.log(type(string)) // string
    console.log(type(boolean)) // boolean
    console.log(type(und)) // undefined
    console.log(type(nul)) // null
    console.log(type(obj)) // object
    console.log(type(array)) // array
    console.log(type(date)) // date
    console.log(type(error)) // error
    console.log(type(reg)) // regexp
    console.log(type(func)) // function

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM