转载

浅谈JS获取数据类型

版权声明:此文章转载自极客头条

如需转载请联系听云College团队成员小尹 邮箱:yinhy#tingyun.com

我们都知道,在js中,数据类型有:String,Number,Boolean,Undefined,Object,Array,Function,Null等,当然,其中Array,Function,Null都是属于Object的.也就是说,我们要如何区分String,Number,Boolean,Undefined,Object甚至于区分Object中的Array,Function,Null,Date,RegExp等.

1. typeof

我们先来看以下最常用的typeof:

var num = 123; var str = 'abc'; var obj = {a: 1,b: 2}; var fun = function(){}; var bool = true; var reg = /123/; var und = undefined; console.log(typeof num);  // number console.log(typeof str);  // string console.log(typeof bool); // boolean console.log(typeof obj);  // object console.log(typeof fun);  // function console.log(typeof reg);  // object console.log(typeof und);  // undefined

上面这些情况,typeof都能正确的简单区分String,Number,Boolean,Undefined,Object以及一个特殊的Object------Function,但是,如果数据是我们通过new关键字生成的数据,就不一样了:

var num = new Number(123); var str = new String('123'); var obj = new Object({a: 1,b: 2}); var bool = new Boolean(true); var fun = new Function('alert(1)'); console.log(typeof num);  // object console.log(typeof str);  // object console.log(typeof obj);  // object console.log(typeof bool); // object console.log(typeof fun);  // function

可以看到,除了function所有的结果都是object,当然,上面本身结果都是Object的数据(数组,正则等)就不再做重复验证.

2. instanceof

instanceof和typeof有所不同,它不能直接返回数据类型,instanceof是一个双目运算符,用来判断一个数据是否为一个对象的实例,返回布尔类型结果.

var num = new Number(123); var str = new String('123'); var obj = new Object({a: 1,b: 2}); var bool = new Boolean(true); var fun = new Function('alert(1)'); var reg = new RegExp('a'); console.log(num instanceof Number); // true console.log(str instanceof String); // true console.log(obj instanceof Object); // true console.log(bool instanceof Boolean); // true console.log(fun instanceof Function); // true console.log(reg instanceof RegExp); // true

这样都是ok的,但是会出现下面几种问题:

1.由于所有的对象都是继承Object,所以上面的数据都可以看成是Object实例化而得到的,那么在进行和Object的instanceof运算的时候都为true:

console.log(num instanceof Object); // true console.log(str instanceof Object); // true console.log(obj instanceof Object); // true console.log(bool instanceof Object); // true console.log(fun instanceof Object); // true console.log(reg instanceof Object); // true

2.最原始的声明方式由于不是通过实例化声明的,会运算结果为false:

console.log('123' instanceof String); // false console.log(123 instanceof Number); // false

3.null和undefined无法正常判断:

console.log(null instanceof Object); // false console.log(undefined instanceof Object); // false // 不要妄想取试undefined instanceof Undefined // Undefined 在js中根本没这个对象

3. Constructor

构造函数,可以通过constructor.name获取数据的构造函数名称来判断:

console.log((123).constructor.name); //Number console.log(new Number(123).constructor.name); // Number console.log('123'.constructor.name); // String console.log(new String('123').constructor.name); // String // ...

这个几乎能完成所有数据的判断,但是,对于null和undefined两个异类同样无力.

4. 总结

综上,要完美的取判断一个数据的数据类型,可以这样写:

function getType(obj) {   if( obj === null ) {     return 'object';   } else if( obj === undefined ) {     return 'undefined';   } else {     return obj.constructor.name.toLowerCase();   } } getType(null); // object getType(undefined); // undefined getType(123); // number getType(new String('ab')); // string

想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

原文  https://blog.tingyun.com/web/article/detail/1014
正文到此结束
Loading...