js实现数据类型的判断

一、js中的内置对象可以根据他们的class属性来区分彼此,实现方式如下:

const classof=(o)=>{

if(o===null)return "Null";

if(o===undefined)return "Undefined";

return  Object.prototype.toString.call(0).slice(8,-1).;

}

二、由于实例对象的class属性都是Object,因此上一中方法检测实例对象失效。可以考虑用instanceof运算符、constructor属性、以及构造函数的名字来检测任意对象的类。

1、如果o继承自c.prototype则:o.instanceof(c)返回true。

2、不使用构造函数作为中介检测原型链上是否存在某个特定的原型对象:如果c.method是原型对象,通过如下方式检测对象o是否是c的类的成员:c.method.isPrototypeOf(o)。

3、因为构造函数是类的公共标识,所以可以用constructor属性来检测(在多个执行上下文的场景中无法正确检测,而且并不是所有的对象都包含constructor属性):

  const type=(o)=>{

       if(o==null)return "";

       swith(o.constructor){

             case Number:    //处理原始类型

                     return "Number: "+o;

                     break;

             case String:

                    return "String:  '"+o+"'";

                    break;

             case Date:     //处理内置类型

                    return "Date: "+o;

                    break;

             case RegExp:

                    return "RegExp: "+o;

                    break;

             case Complex:       //处理自定义类型

                    return "Complex: "+o;

                    break;

       }

}

4、使用instanceof和coustructor属性来检测对象所属的类都有一个主要问题:在多个执行上下文中存在构造函数的多个副本的时候,检测结果不准确,接下来介绍使用构造函数的名字,而不是构造函数本身作为类标识符。在一些js的实现中,为函数对象提供了一个非标准的属性name,用来表示函数的名称。对于没有这一属性的js来说,可以将函数转换为字符串,然后从中提取函数名。

     const getName=()=>{

           return this.name|| this.toString().match(/function\s*([^()*]\(/)[1];

     };

























  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值