基本一:JS数据类型

*本文章重要总结一下js数据范例的辨认推断要领
tyoeof
instanceof
Object.prototype.toString.call
constructor
末了封装一个函数,可以鉴别一切的范例*

1.数据范例

基础范例:

  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"

结论:

  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]);
    }

封装的道理:

  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是小写以外,其他的首字母都是大写。

    原文作者:yangdepp
    原文地址: https://segmentfault.com/a/1190000005913731
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞