基礎一:JS數據類型

*本文章主要總結一下js數據類型的識別判斷方法
tyoeof
instanceof
Object.prototype.toString.call
constructor
最後封裝一個函數,能夠判別全部的類型*javascript

1.數據類型

基本類型:java

  1. Undefined類型:該類型只有一個值,即undefined(小寫),在使用var聲明變量可是未對其加以初始化時,這個變量的值就是undefined。
  2. Null類型:該類型也只有一個值,即null(小寫),null值表示一個空對象指針,因此用typeof操做符檢測null值會返回object的緣由。
  3. Boolean類型:改類型有兩個值:true和false(小寫)
  4. Number類型:表示整數和浮點數
  5. String類型:即字符串

引用類型數組

  1. Object類型:即對象
  2. Array類型:數組
  3. Date類型:日期
  4. RegExp類型:正則
  5. Function類型

2.類型的識別的判斷方法

(1)typeof總結:

首先typeof不是方法,只是一個操做符。函數

  1. 能夠識別標準類型(Null除外
  2. 不能識別具體的對象類型(Function除外
  3. 返回的值首字母都是小寫!!!!!!!!
//識別標準類型
        typeof "jerry";      //"string"
        typeof 12;           //"number"
        typeof true;         //"boolean"
        typeof undefined;   //"undefined"
        typeof null;         //"object"
        typeof {name:"jerry"};   //"object"
        
    //識別引用類型
        typeof function(){};  //"function"
        typeof [];            //"object"
        typeof new Date;     //"object"
        typeof /\d/;         //"object"
        //建立一個自定義對象
        function Person(){};
        typeof new Person;      //"object"

(2)instanceof

//可以判別引用類型
    [] instanceof Array;       //true
    /\d/ instanceof RegExp;    //true
    new Date instanceof Date;  //true
    var a = function(){}; 
    a instanceof Function;     //true
   
    //不能判別原始類型
    1 instanceof Number;          //false
    "jerry" instanceof String;  //false
    
    //可以判別自定義對象類型及父子類型
    //自定義類型
    function Person(){};
    Person instanceof Function;  //true
    //父子類型
    function Point(x,y){
        this.x = x;
        this.y = y;
    }
    function Cirele(x,y,r){
        Point.call(this,x,y);
        this.radius = r;
    }
    Circle.prototype = new Point();
    Circle.prototype.constructor = Circle;
    var c = new Circle(1,1,2);
    c instanceof Circle  //true
    c instanceof Point  //true

結論測試

  1. 能夠判別內置對象類型
  2. 不能判別原始類型
  3. 判別自定義對象類型
  4. 結合1和3,用instanceof能夠識別全部的對象類型

(3)Object.prototype.toString.call

Object.prototype.toString.call("123");    //"[object String]"
    
    //封裝函數,並作截取
    function type(obj){
        return Object.prototype.toString.call(obj).slice(8,-1);
    }
    //測試
    type("123");  //"String"
    
    //自定義類型
    function Point(x,y){
        this.x = x;
        this.y = y;
    }
    //測試
    type(new Point(1,2));       //"Object"

結論:this

  1. 上述封裝的函數能夠識別基本類型以及引用對象類型
  2. 不能識別自定義對象類型

(4)constructor(構造這個對象的構造函數的自己)

//判斷基本類型(基本類型也有構造函數);可是null和undefined除外,它倆沒有構造函數
    "jerry".constructor === String;  //true
    (1).constructor ===Number;        //true
    
    //判斷引用類型
    new Date().constructor === Date;  //true
    [].constructor === Array;   //true
    
    //判斷自定義對象
    function Person(name){
        this.name = name;
    }
    new Person("jerry").constructor === Person; //true
    
    //對constructor判別進行方法的封裝
    function getConstructorName(obj){
        return (obj===undefined||obj===null)?obj:        
           (obj.constructor && obj.constructor.toString().match(/function\s*([^(]*)/)[1]);
    }

封裝的原理:prototype

  1. obj:假如傳入的參數是null或者undefined,沒有構造函數直接返回
  2. obj.constructor若是存在執行&&後面的語句
  3. obj.constructor.toString():將類型對應的構造函數轉化成字符串 "Function Number(){code...}"
  4. math(/function\s*([^(]*)/)[1]:匹配構造函數的名稱,正則匹配

結論:指針

  1. 判別基本類型(Undefined/Null除外)
  2. 判別引用類型
  3. 判別自定義對象類型

結論:因此能夠封裝一個函數getConstructorName判斷全部類型,可是這個函數返回的除了null和undefined是小寫以外,其餘的首字母都是大寫。code

相關文章
相關標籤/搜索