JS类型识别

一、JS中的类型分为以下几种:
1、原始(值)类型:
    1)Undefined、Null:单分出来的原因是它们没有构造函数。
    2) Number、String、Boolean。
2、对象(引用)类型:
    Object、Array、Date、RegExp、自定义对象……
二、原始类型与对象类型的区别:栈内存、堆内存
    原始类型使用栈内存,变量名对应的存储空间内是值本身;
    对象类型使用堆内存,变量名对应的存储空间内是指向实际值的指针。
    (扩展:浅拷贝和深拷贝)
三、类型识别:
1、typeof:操作符、很常用、可识别原始类型,不可识别对象类型
    -typeof "Jerry"; //"string"(首字母小写~)
    -typeof undefined; //"undefined"
    -typeof {}; //"object"
     -特殊的:typeof null; //"object"
     -特殊的:typeof (function(){});//"function"
    -对于[]、new Date()、/\s/i、function Person(){},均显示”object“。
2、instanceof:可判别内置对象类型,不可判别原始类型
    -[] instanceof Array;//true
    -/\d/ instanceof RegExp;//true
    -12 instanceof Number://false
    -"Tommy" instanceof String;//false
    但是!instanceof可以判别自定义对象类型及父子类型!
    function Point(x,y){this.x=x; this.y=y;}
    function Cirlcle(x,y,r){Point.call(this,x,y); this.radius=r;}
    Circle.prototype=new Point(); 
    Circle.prototype.constructor=Cirlcle;
    //创建一个Cirlcle对象:
    var c =new Circle (1,1,2);
    //可以看到c既属于Circle也属于Point
    c instanceof Circle; //true
    c instanceof Point; //true
3、Object.prototype.toString.call:使用原型链判断对象的属性,可判断标准类型和内置对象类型,不可判断自定义类型
    -Object.prototype.toString.call(obj).slice(8,-1);
    可识别:Number、String、Boolean、Undefined、Null、Object、Array、Date、RegExp、Function
        例:Object.prototype.toString.call(function(x){return x;}).slice(8,-1); //"Function"
    不可识别:自定义对象:
        例:function Point(x,y){this.x=x; this.y=y;}
               Object.prototype.toString.call(new Point(1,2)).slice(8,-1); //"object"
4、利用对象的constructor(构造函数)
    1)除了Undefined和Null以外,所有对象都有自己的构造函数;
    2)用编译器选中一个函数,在_proto_属性下的constructor属性中可以看到对象的构造函数;
    3)例:
    //可以判别标准类型:
    "Jerry".constructor===String; //true;
    //可以判别内置对象类型:
    new Date().constructor===Date; //true;
    //可以判别自定义对象类型:
    function Person(name){ this.name=name;}
    new Person("Jerry").constructor===Person; //true;
    //不能判别自定义对象类型:
    Null.constructor; //Uncaught Reference Error:Null is not defined(...) VM9364:2
    一个简单的判别函数:
    function getConstructorName(obj){
        return obj&&obj.constructor&&obj.constructor.toString().match(/function\s([^(]*)/)[1];
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值