JavaScript中的数据类型分为基础数据类型和引用数据类型,其中
基本数据类型:string、number、boolean、undefined、null和Symbol,
引用数据类型:Object、Function、Date、RegExp、Number、String、Boolean
因为一般情况下不会以如下方式创建字符串和数字,故本文不讨论这种类型。
let str = new String('str'),num = new Number(123),boole = Boolean(true);复制代码
首先创建一些供检测的变量
let myNull = null,myUndefined = undefined,mySymbol = Symbol(123),str = 'str',num = 123,boole = false,arr = [1,2,3],obj = { name:'obj.name'},date = new Date(),reg = /\d{6}/g;function foo(){};复制代码
typeof
首先用常用的方式typeof判断一下
console.log(typeof myNull); // objectconsole.log(typeof myUndefined); // undefinedconsole.log(typeof mySymbol); // symbolconsole.log(typeof str); // stringconsole.log(typeof num); // numberconsole.log(typeof boole); // booleanconsole.log(typeof arr); // objectconsole.log(typeof obj); // objectconsole.log(typeof date); // objectconsole.log(typeof reg); // objectconsole.log(typeof foo); // function复制代码
可见typeof方法对于null和引用数据类型都会返回object,对于其他基本数据类型以及function的判断都是准确的(typeof null === 'object'的原因这里不赘述)
instanceof
对于typeof无法准确判断引用数据类型,可以采用instanceof进行补充判断
console.log(arr instanceof Array); // trueconsole.log(obj instanceof Object); // trueconsole.log(date instanceof Date); // trueconsole.log(reg instanceof RegExp); // trueconsole.log(foo instanceof Function); // true复制代码
如上所示,此方法只适合判断变量是不是想要的引用数据类型
constructor
而对于不需要判断null和undefined的情况,我们还可以使用constructor
constructor 属性返回对创建此对象的数组函数的引用
console.log(mySymbol.constructor === Symbol); // trueconsole.log(str.constructor === String); // trueconsole.log(num.constructor === Number); // trueconsole.log(boole.constructor === Boolean); // trueconsole.log(arr.constructor === Array); // trueconsole.log(obj.constructor === Object); // trueconsole.log(date.constructor === Date); // trueconsole.log(reg.constructor === RegExp); // trueconsole.log(foo.constructor === Function); // true复制代码
和instanceof类似,constructor 方法只适合判断变量是不是想要的引用数据类型,但是它可以判断null和undefined除外的所有数据类型,之所以null和undefined不可以,是因为他们作为JavaScript运行环境创建时就存在的基本数据类型,不存在constructor属性
Object.prototype.toString()
那有没有一种方法可以准确的判断所有数据类型的数据类型呢,推荐如下方法
console.log(Object.prototype.toString.call(myNull)); // [object Null]console.log(Object.prototype.toString.call(myUndefined)); // [object Undefined]console.log(Object.prototype.toString.call(mySymbol)); // [object Symbol]console.log(Object.prototype.toString.call(str)); // [object String]console.log(Object.prototype.toString.call(num)); // [object Number]console.log(Object.prototype.toString.call(boole)); // [object Boolean]console.log(Object.prototype.toString.call(arr)); // [object Array]console.log(Object.prototype.toString.call(obj)); // [object Object]console.log(Object.prototype.toString.call(date)); // [object Date]console.log(Object.prototype.toString.call(reg)); // [object RegExp]console.log(Object.prototype.toString.call(foo)); // [object Function]复制代码
如果有错误或者不严谨的地方,请给予指正,十分感谢!