【JavaScript】这四种判断数据类型的方法,你都清楚吗?

92 阅读1分钟

因为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 BC 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类型返回元素组成的字符串

只有Object对象的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]