1. 判断数据类型的方法
1. typeof
使用简单,但功能不完整,不能判断所有的数据类型,如下表所示:
类型 | 结果 |
---|---|
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
BigInt | "bigint" |
String | "string" |
Symbol | "symbol" |
Function | "function" |
其他任何对象 | "object" |
2. toString
使用Object.prototype.toString.call()
可正确判断所有数据类型,返回形如"[object XXX]"
的字符串。
3. instanceof
instanceof
运算符用于检测构造函数的prototype
属性是否出现在某个实例对象的原型链上。并不能用来判断数据类型。
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const auto = new Car('Honda', 'Accord', 1998);
console.log(auto instanceof Car); // true
console.log(auto instanceof Object); // true
2. 封装判断数据类型函数
我们可以通过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()
:
const 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
完成!
📘📘欢迎在我的博客上访问:
https://lzxjack.top/