本文章 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;
}
网友评论