检测数据类型的四种方法

typeof
返回全部小写字符串,如:‘object’ ‘string’
typeof可以判断除了null以外的基本数据类型
typeof只能判断对象类型中的function,其它都为objecct

instanceof
A instanceof B 返回的是Boolean类型的值
B的prototype是否出现在A的原型链(proto)上
instanceof可以准确判断对象类型数据,但不能准确检测原始类型。

function myInstance(left, right) {
      let bb = right.prototype;
      left = left.__proto__;
      while (true) {
        if (left === null) { return false }
        if (left === bb) { return true }
        left = left.__proto__;
      }
    }

constructor:
原理:在类的原型上一般都会带有constructor属性,存储当前类本身,我们也是利用这一点,获取实例的constructor属性值,验证是否为所属的类,从而进行数据类型检测。
局限:
constructor属性值太容易被修改

console.log(12.constructor===Number); //true

除了null和undefined。constructor可以正确检测出原始类型和对象类型。

Object.prototype.toString.call(value);

调用Object原型上的toString方法,让方法执行的时候,方法中的this是要检测的数据类型。
在所有数据类型的类中,他们的原型上都有toString方法,除Object.prototype.toString不是把数据值转换为字符串,而是检测当前实例隶属类的详细信息的(检测数据类型)。其余的都是转为字符串,
1.通过原型链查找机制,找到Object.prototype.toString
2.把找到的方法执行,方法中的this->obj
3.方法内部把this(obj)的隶属类信息输出。=》方法执行,方法中的this是谁,就是检测谁的所属类信息。

可以检测所有数据类型。

封装一个检测数据类型的方法:

   function getType(obj) {
      let res = typeof obj;
      if (res !== 'object') { return res }
      return Object.prototype.toString.call(obj).slice(8, -1).toLowerCase();
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值