JS 类型判断

66 阅读2分钟

在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(全能准)。