JavaScript判断数据类型的方法都有哪些呢?
首先我们最容易想到的肯定是typeof,因为这个方法的名字就说明了它的作用——就是用来检测类型的。
typeof
console.log(typeof 2); // number
console.log(typeof true); // boolean
console.log(typeof 'str'); // string
console.log(typeof function(){}); // function
console.log(typeof undefined); // undefined
但是typeof也有自己的弊端,它只能判断基础类型数据,遇到Object、Array、Null都会被判断为Object
console.log(typeof {}); // object
console.log(typeof []); // object
console.log(typeof null); // object
为了可以判断引用类型对象,我们可以使用下面的方法instanceof来判断。
instanceof
instanceof可以正确地判断对象类型,不能判断普通类型。它的内部实现机制就是判断这个对象在它原型链上能否找到它的原型,简单的说就是只要对象__ proto __和构造函数的prototype指向同一个引用,就为true,因此可以用来判断一个对象是否是一个类的实例。
console.log(2 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log('str' instanceof String); // false
console.log([] instanceof Array); // true
console.log(function(){} instanceof Function); // true
console.log({} instanceof Object); // true
可以简单的认为typeof+instanceof的组合就能够准确判断出所有数据类型。
但是如果有多层继承,instanceof就会出问题。
例如B继承A,C继承B,此时输入C instanceof B和C instanceof A都会为true,这样就分不清C是谁的实例了
解决方法就是直接验证它的构造函数
C.__ proto __.constructor == B(简写:C.constructor == B) true
C.__ proto __.constructor == A false
那难道就没有一个方法是能够直接准确判断出所有类型的数据吗?答案是有的!
最狠的方式就是直接通过构造函数判断
constructor
console.log((2).constructor === Number); // true
console.log((true).constructor === Boolean); // true
console.log(('str').constructor === String); // true
console.log(([]).constructor === Array); // true
console.log((function() {}).constructor === Function); // true
console.log(({}).constructor === Object); // true
但是这种方法需要通过通过原型访问到构造函数,如果这个数据的原型被修改了,这个方法就行不通了
Object.prototype.toString.call()
通过对象原型上的的toString方法可以判断类型
为什么要用call调用?
因为数组、函数等都对toString方法进行了重写,例如:function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串
只有原来的对象的toString方法才能判断类型。
let a = Object.prototype.toString;
console.log(a.call(2)); //[object Number]
console.log(a.call(true)); //[object Boolean]
console.log(a.call('str')); //[object String]
console.log(a.call([])); //[object Array]
console.log(a.call(function(){})); //[object Function]
console.log(a.call({})); //[object Object]
console.log(a.call(undefined)); //[object Undefined]
console.log(a.call(null)); //[object Null]