js判断数据类型的方法,js获取数据类型的方法,js util类

js中有typeof运算符,instanceof运算符,constructor属性,Object.prototype.toString方法,四种方法来判断数据类型;

但这四种方法都有缺陷:

typeof 方法只能判断出基础数据类型,判断不出引用类型;

typeof [] //object
typeof null //object

instanceof 是判断左则是不是右侧的实例,且他是通过查找原型链判断。所以回有以下缺陷:

var a = '';
a instanceof String // false 因为a不是String的实例,a只是一个以string为数据类型的值,所以false
var b = new String('');
b instanceof String // true 
c instanceof Object //true js的对象原型链最终都会指向Object构造类,所以他返回的true

var c = [1,2,3];
c instanceof Array //true
c instanceof Object //true 同样是原型链判断的问题

constructor 是判断当前变量的构造函数指向,但在判断NaN Infinity会存在问题:

var a = Number('xx1') //这时候返回的是NaN对象
a.constructor.name //Number 因为NaN还是属于 Number构造类, 所以他的构造函数还是指向了Number
//Infinity 同理

Object.prototype.toString 他可以找到已有JS中本身的大部分数据类型,但他也判断不了自定义的构造函数类型,也判断不了NaN Infinity

var arr = [1,2,3]
var nan = Nubmer('1xx');
var str = 'xxx';
Object.prototype.toString.call(arr) //[object Array]
Object.prototype.toString.call(nan) //[object Nubmer]
Object.prototype.toString.call(str) //[object String]
var A = function(){};
var a = new A();
Object.prototype.toString.call(a) //Object 

基于以上问题,Jsutil的_getVarType结合了以上方法进行了封装,可以获取到各类型数据,包括(NaN,Infinity,和自定义类型);

源码如下:

/**
 * 获取变量类型
 * 'Null',
 * 'Undefined',
 * 'Object',
 * 'Array',
 * 'String',
 * 'Number',
 * 'Boolean',
 * 'Function',
 * 'RegExp',
 * 'NaN',
 * 'Infinity'
 * 'Date'
 * 自定义构造函数类:小写函数名
 * @param {*} o
 * @returns string
 */
const _GetVarType =  (o:any):string =>{
   let typeStr = (Object.prototype.toString.call(o).match(/\[object (.*?)\]/) || [])[1];
   //增加自定义类型获取
   if(typeStr === 'Object'){
      typeStr += `:${o.constructor.name}`
   } else if(typeStr === 'Number'){
       //判断为非数字
      if(!isFinite(o)){
          //判断为NaN类型
         if(isNaN(o)){
            typeStr = 'NaN'
         }else{
            typeStr = 'Infinity'
         }
      }
   }
   return typeStr;
}

 本博客js util分类下所有方法都集成在Jsutil库Jsutil是一个js util工具类一个功能型函数库

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值