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

2022-11-12  本文已影响0人  Blank_8c8e

本文章 js util分类下所有的方法都集成在Jsuitl 库中,该库是一个功能型函数库,欢迎大家引用及Star或者提出宝贵的意见

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 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;
}
上一篇下一篇

猜你喜欢

热点阅读