【JavaScript】判断数据类型的方法都有哪些?

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值