Javascript内置四种数据类型检测及通用方法编写

方法一:typeof

  • 语法:typeof[val]
  • 返回结果:字符串,该字符串中包含所属的数据类型
  • 局限性: 基于typeof检测null的结果是’object’,但是null是空对象指针属于基本数据类型,并不是对象(因为所有值在计算机中都以二进制编码存储,浏览器会把前三位是000的当作对象,而null前三位就是000,所以检测的时候浏览器会把null当作对象);基于typeof无法细分出是普通对象还是数组正则等,只要是对象返回的都是‘object’;
  • 有个小知识点需要注意下:多个typeof检测的结果一定时字符串’string’(面试题)
typeof typeof typeof {name:'sss'}  //=>'string'

方法二:instanceof

  • 实例 instanceof 类
  • 返回结果:true 或者 false
  • 检测机制:验证当前类的原型prototype是否会出现在实例的原型链上,只要在它的原型链上,结果都为true
  • 局限性:要检测的实例必须是对象数据类型,基本数据类型无法检测;不管是数组还是正则都是Object的实例,检测结果都是true,所以要想判断是否为普通对象,必须检测好几次才可以;
  • 补充:实例时对象数据类的,但是基本值也是对应类的实例,比如10是Number的实例,但是10却不是对象数据类型,个人认为把10理解为不标准的实例( 各位老铁有更好的理解评论区走一波)。
[1,2] instanceof Array    //=>true
{name:'sss'} instanceof Object //=>true

方法三:constructor

  • 语法:[val].constructor === 类
  • 返回结果:true 或者 false
  • 判断当前实例的constructor的属性值是否是你预估的类
  • 局限性:把类的原型j进行重定向,在重写过程中可能出现把之前的constructor属性值覆盖掉或者压根没有constructor,这样检测的结果就不准了(注意内置类不能进行重定向,但是内置类的constructor属性值却可以修改);如果给检测的对象数据类型增加私有的constructor属性,检测的结果也就不准确了
Array.prototype.constructor = 'sss';   //=>"sss"
[].constructor === Array; //=>fasle;

方法四:Object.prototype.toString.call()

  • 语法:Object.prototype.toString.call([val])
  • 目前来说检测结果比较准确,项目中用的也是最多的
Object.prototype.toString.call([])  //=>"[object Array]"
Object.prototype.toString.call(10)  //=>"[object Number]"

自己写的数据类型检测方法

function toType(val) {
   // 如果检测的数据类型是null或者undefined直接用返回当前值加空字符串
   if (val == null) {
      return val + '';
   };
   let obj = {},
      testMethod = obj.toString; // teseMethod等于Object.prototype.toString;
   "Boolean Number String Function Array Date RegExp Object".split(' ').forEach(item => {
      obj[`[object ${item}]`] = item.toLowerCase();
   });

   /* 
   obj如下:
   {
      [object Array]: "array",
      [object Boolean]: "boolean",
      [object Date]: "date",
      [object Function]: "function",
      [object Number]: "number",
      [object Object]: "object",
      [object RegExp]: "regexp",
      [object String]: "string",
   }
   */
   if (typeof val === 'object' || typeof val === 'function') {
      return obj[testMethod.call(val)];
   }
   return typeof val;
};
console.log(toType(1)); //=>"number"
console.log(toType(NaN)); //=>"number"
console.log(toType([])); //=>"array"
console.log(toType(/^\d+$/)); //=>"regexp"
console.log(toType({})); //=>"object"
console.log(toType(Symbol(1))); //=>"symbol"
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值