JavaScript数据类型

本文章主要总结一下js数据类型的识别判断方法
tyoeof
instanceof
Object.prototype.toString.call
constructor
最后封装一个函数,可以判别所有的类型

1.数据类型

基本类型

1.Undefined类型:该类型只有一个值,即undefined(小写),在使用var声明变量但是未对其加以初始化时,这个变量的值就是2.undefined。
Null类型:该类型也只有一个值,即null(小写),null值表示一个空对象指针,所以用typeof操作符检测null值会返回object的原因。
3.Boolean类型:改类型有两个值:true和false(小写)。
4.Number类型:表示整数和浮点数
5.String类型:即字符串

引用类型

Object类型:即对象
Array类型:数组
Date类型:日期
RegExp类型:正则
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是小写之外,其他的首字母都是大写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值