实现效果
console.log(getType(123)); // number
console.log(getType('string')); // string
console.log(getType(true)); // boolean
console.log(getType(undefined)); // undefined
console.log(getType(null)); // null
console.log(getType({
})); // object
console.log(getType([])); // array
console.log(getType(/123/)); // regexp
console.log(getType(new Date())); // date
实现过程
我们可以通过typeof
来查看数据的类型,但是在 JavaScript 中,null
、对象{}
、数组[]
、正则表达式/123/
、日期new Date()
都被认为是object
,如下代码所示:
console.log(typeof 123); // number
console.log(typeof 'string'); // string
console.log(typeof true); // boolean
console.log(typeof undefined); // undefined
//----------------------------------------
console.log(typeof null); // object
console.log(typeof {
}); // object
console.log(typeof []); // object
console.log(typeof /123/); // object
console.log(typeof new Date()); // object
此时若我们希望输入一个数组[]
,直接得到array
这样的返回值,使用typeof
就无法实现了。
那么如何直接得到array
呢?
我们先来看下面一段代码:
console.log(Object.prototype.toString.call(null)); // [object Null]
console.log(Object.prototype.toString.call({
})); // [object Object]
console.log(Object.prototype.toString.call([])); // [object Array]
console.log(Object.prototype.toString.call(/123/)); // [object RegExp]
console.log(Object.prototype.toString.call(new Date())); // [object Date]
可以看到,通过Object.prototype.toString.call()
,将需要判断的数据类型放入call()
中就可以得到需要的字符,如Null
、Array
、RegExp
等。
// 返回的是一个字符串
console.log(typeof Object.prototype.toString.call([])); // string
比如Object.prototype.toString.call([])
返回[object Array]
,它是一个字符串,那么将这个字符串中除了Array
以外的字符全删掉即可得到Array
。
// 字符串中除了 Array 以外的字符全删掉即可得到 Array
console.log(Object.prototype.toString.call([]).replace('[object ', '').replace(']', '')); // Array
为了和typeof
的输出形式一致,将其返回的结果转化为小写即可。
// 转化为小写
console.log(Object.prototype.toString.call([]).replace('[object ', '').replace(']', '').toLowerCase()); // array
最后,将上述过程封装成自己的函数getType()
:
function getType(obj) {
return typeof obj === 'object' ? Object.prototype.toString.call(obj).replace('[object ', '').replace(']', '').toLowerCase() : typeof obj;
}
首先判断typeof
返回值是否为'object'
,若是则需要进行处理;若不是则直接返回即可。
验证
console.log(getType(123)); // number
console.log(getType('string')); // string
console.log(getType(true)); // boolean
console.log(getType(undefined)); // undefined
console.log(getType(null)); // null
console.log(getType({
})); // object
console.log(getType([])); // array
console.log(getType(/123/)); // regexp
console.log(getType(new Date())); // date
完成!