我们都知道,在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. instanceofinstanceof和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 |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|