在JS中有很多数据类型,它们大体上可以分为两类,一类称基本数据类型,一类称引用数据类型。
刚好有两个专门做类型判断的关键字,一个擅长对基本类型做判断,一个擅长对引用类型做判断。
它们就是 typeof 和 instanceof。
还有一个可以针对所有类型做判断,是全能的,是Object.prototype.toString.call()。
还有一个专门针对数组做判断的,是Array.isArray()。
综上,JS一共有4种类型判断的方式,一种针对基本数据类型、一种针对引用数据类型、一种全能、一种只对数组有用。
下面我们一一介绍。
一 typeof
它擅长判断基本数据类型,对引用数据类型的判断比较笼统,一般不拿它来判断引用数据类型,判断结果如下:
null -> 'object'
undefined -> 'undefined'
Number -> 'number'
Boolean -> 'boolean'
String -> 'string'
BigInt -> 'bitgint'
Symbol -> 'symbol'
Object -> 'object'
Fuction -> 'function'
注意:对未声明的和对未初始化的变量使用会返回'undefined'
Object类型返回较为笼统
二 instanceof
可以判断内置对象类型和自定义对象类型,不能判别基础类型,返回true/false。
它的原理是沿着原型链去找,只要在原型链上就返回true,所以用Array和Object来判断[],都会返回true,判断结果如下:
[] instanceof Array; // true
{} instanceof Object; // true
new Date() instanceof Date;// true
123 instanceof Number; // false (字面量不是对象)
new Number(123) instanceof Number; // true
三 Object.prototype.toString.call()
可以针对所有类型做判断,判断结果如下:
Object.prototype.toString.call(123); // "[object Number]"
Object.prototype.toString.call('abc'); // "[object String]"
Object.prototype.toString.call(true); // "[object Boolean]"
Object.prototype.toString.call(null); // "[object Null]"
Object.prototype.toString.call(undefined); // "[object Undefined]"
Object.prototype.toString.call([]); // "[object Array]"
Object.prototype.toString.call({}); // "[object Object]"
Object.prototype.toString.call(new Date());// "[object Date]"
Object.prototype.toString.call(/abc/); // "[object RegExp]"
Object.prototype.toString.call(function(){});// "[object Function]"
四 Array.isArray()
专门用于判断是否为数组,判断结果如下:
Array.isArray([]); // true
Array.isArray({}); // false
Array.isArray(null); // false
总结
如果是基本数据类型的判断,使用typeof。
如果是数组类型的判断,使用Array.isArray()。
如果是除数组外的其它引用数据类型的判断,使用instanceof。
如果是编写通过工具库,需要底层工具封装,使用Object.prototype.toString(全能准)。