如何检测JavaScript数据类型

JavaScript数据类型

Javascript有两种数据类型,分别是基本数据类型引用数据类型。其中基本数据类型包括Undefined、Null、Boolean、Number、String、Symbol (ES6新增,表示独一无二的值),而引用数据类型统称为Object对象,主要包括对象、数组和函数。

1、typeof

typeof返回一个表示数据类型的字符串,返回结果包括:number、boolean、string、symbol、object、undefined、function 7种数据类型,但不能判断null、array

typeof '' //string
typeof Symbol() //symbol
typeof 1 //number
typeof true //boolean
typeof undefined //undefined
typeof new Function()//function
typeof null// undefiend  (无效)
typeof [] //object(无效)
typeof new Date()//object(无效)

注意:用typeof判断数据类型是,数组和对象都返回object,并且也无法判断null。

instanceof

instanceof 用来判断A是否为B的实例,表达式为 A instanceof B。如果A是B的实例,则返回true,否则返回false。

[] instanceof Array  //true
var a = {};
a instanceof Object //true

数组类型判断,还可以用ES6新增Array.isArray() 方法判断

Array.isArray([])//true

instanceof的弊端

  • 对于基本数据类型来说,字面量方式创建出来的结果和实例方式创建出来的结果不一致。
10 instanceof Number //false
new Number(10) instanceof Number //true

从严格意义上来讲,只有实例创建出来的结果才是标准的对象数据类型值,也是标准的Number这个类的一个实例;
对于字面量方式创建出来的结果是基本的数据类型值,不是严谨的实例。

  • 只要在当前实例的原型链上,我们用其检测出来的结果都是true。在类的原型继承中,我们最后的检测未必准确。
var arr = ['a','b','c'];
arr instanceof Array //true
arr instanceof Object //true
({}) instanceof Object // true

function fei(){}
fei instanceof Function //true
fei instanceof Object //true
  • 不能检测 null 和 nudefined

constructor检测

constructor 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。

constructor作用和instanceof非常相似。
但constructor检测 Object与instanceof不一样,还可以处理基本数据类型的检测。

var arr = ['a','b','c',2,1];
arr.constructor === Array // true
arr.constructor === Object // false

(10).constructor=== Number //true
true.constructor === Boolean //true
''.constructor === String

function fei(){}
sai.constructor === Function //true
sai.constructor === Object //false

var reg = /^$/;
reg.constructor === RegExp //true
reg.constructor === Object //false

constructor检测弊端

  • nullundefined 是无效的对象,这两种类型的数据需要通过其他方式来判断。
  • 函数的 constructor 是不稳定的,这个主要体现在把类的原型进行重写,在重写的过程中很有可能出现把之前的constructor给覆盖了,这样检测出来的结果就不准确了。
function Sai(){};
Sai.prototype = new Array();
var sai = new Sai();
sai.constructor === Array //true

最精准也是最常用判断数据类型的方法

Object.prototype.toString.call();

Object上的toString它的作用是返回当前方法执行的主体所属类的详细信息即"[object Object]",其中第一个object代表当前实例是对象数据类型(这个是固定死的),第二个Object代表的是this所属的类是Object。

Object.prototype.toString.call('');                            //[object String]
Object.prototype.toString.call(1);                             //[object Number]
Object.prototype.toString.call(true);                          //[object Boolean]
Object.prototype.toString.call([]);                            //[object Array]
Object.prototype.toString.call({});                            //[object Object]
Object.prototype.toString.call(undefined);                     //[object Undefined]
Object.prototype.toString.call(null);                          //[object Null]
Object.prototype.toString.call(new Function());                //[object Function]
Object.prototype.toString.call(new Date());                    //[object Date]
Object.prototype.toString.call(new RegExp());                  //[object RegExp]
Object.prototype.toString.call(new Error());                   //[object Error]
Object.prototype.toString.call(document);                      //[object HTMLDocument]
Object.prototype.toString.call(window);                        //[object Window]

toString方法说明

  • 本意是转换为字符串,但是某些toString方法不仅仅是转换为字符串;
  • 对于Number、String,Boolean,Array,RegExp、Date、Function原型上的toString方法都是把当前的数据类型转换为字符串的类型;
  • Object上的toString并不是用来转换为字符串的;

参考资料

前端工匠

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值