如何检测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检测弊端
- null 和 undefined 是无效的对象,这两种类型的数据需要通过其他方式来判断。
- 函数的 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并不是用来转换为字符串的;