js判断数据类型的方法,js获取数据类型的方法,js util类
本博客js util分类下所有方法都集成在Jsutil库中,Jsutil是一个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; }

浙公网安备 33010602011771号