js类型判断大总结(typeof、instanceof、Object.prototype.toString.call())
首先来谈谈下,js现在有多少种数据类型;截至到现在js目前有8种数据类型,其中包括7种基本数据类型,和引用数据类型
基本数据类型:
number(数值类型,其中NaN、Infinity、-Infinity都属于number类型)
string(字符串类型)
null
undefined
bollean(true和false)
symbol(es6新类型)
bigint(es6新类型)
引用数据类型:
array(数组对象)
object(对象类型)
function(函数对象)
其他内置对象(Set、Map、Date等)
那js有这么多种数据类型,我们要怎么判断区分出他们嘞?
可以使用一下三种方法,让我们来看看这三种方法有什么不同吧!
判断数据类型的方法:
typeof
instanceof
Object.prototype.toString.call()
首先typeof判断基本数据类型时除了null类型返回'object'外,其他基本数据类型都正常返回;typeof判断引用数据类型时,除了function类型返回‘function’外,其他引用数据类型(包括js内置对象)都返回'object'--------- 总的来说,typeof基本可以区分基本数据类型,基本不能区分引用数据类型,但各有两个例外,null返回'object'、function返回'function'
let type_1 = 1,type_2 = true,type_3 = null,type_4 = undefined,type_5 = '', type_6 = Symbol(''),type_7 = BigInt("9007199254740995"), type_8 = new Function(),type_9 = [],type_10 = {},type_11 = Infinity // 内置js对象 let date = new Date(),map = new Map(),set = new Set() console.log('1-',typeof type_1) // 'number' console.log('2-',typeof type_2) // 'bollean' console.log('3-',typeof type_3) // 'object' 作为基本数据,null返回'object' console.log('4-',typeof type_4) // 'undefined' console.log('5-',typeof type_5) // 'string' console.log('6-',typeof type_6) // 'symbol' console.log('7-',typeof type_7) // 'bigint' console.log('8-',typeof type_8) // 'function' 作为引用数据类型,function返回'function' console.log('9-',typeof type_9) // 'object' console.log('10-',typeof type_10) // 'object' // 其他js内置对象都返回'object' console.log('date-',typeof date) // 'object' console.log('map-',typeof map) // 'object' console.log('set-',typeof set) // 'object'
竟然typeof区分不出null和除了function之外的引用数据类型,那我们要怎么办呢?这时候可以考虑一下instanceof了;instanceof 操作符可以用来判断某个构造函数的 prototype 属性是否存在另外一个要检测对象的原型链上。 也就是判断instanceof前面的对象是否是后面的类或对象的实例。所以我们可以通过instanceof来区分引用数据类型。
let type_1 = 1,type_2 = true,type_3 = null,type_4 = undefined,type_5 = '', type_6 = Symbol(''),type_7 = BigInt("9007199254740995"), type_8 = new Function(),type_9 = [],type_10 = {} // 内置js对象 let date = new Date(),map = new Map(),set = new Set() console.log(type_8 instanceof Function) // true console.log(type_9 instanceof Array) // true console.log(type_10 instanceof Object) // true console.log(date instanceof Date) // true console.log(map instanceof Map) // true console.log(set instanceof Set) // true // object为所有引用数据类型的原型(处在原型链顶端) console.log(type_8 instanceof Object&&type_9 instanceof Object&&date instanceof Object) // true
好了现在就剩下孤零零的null不能被区分了,而且上面的两种方法都不能完全满足我们的需要,这时候就要出动万精油老大哥了Object.prototype.toString.call(),关于其中的原理可以参考这位大佬的博客
从深入到通俗:Object.prototype.toString.call() - 知乎 (zhihu.com)
let type_1 = 1,type_2 = true,type_3 = null,type_4 = undefined,type_5 = '', type_6 = Symbol(''),type_7 = BigInt("9007199254740995"), type_8 = new Function(),type_9 = [],type_10 = {} // 内置js对象 let date = new Date(),map = new Map(),set = new Set() console.log(Object.prototype.toString.call(type_1)) // '[object Number]' console.log(Object.prototype.toString.call(type_2)) // '[object Boolean]' console.log(Object.prototype.toString.call(type_3)) // '[object Null]' console.log(Object.prototype.toString.call(type_4)) // '[object Undefined]' console.log(Object.prototype.toString.call(type_5)) // '[object String]' console.log(Object.prototype.toString.call(type_6)) // '[object Symbol]' console.log(Object.prototype.toString.call(type_7)) // '[object BigInt]' console.log(Object.prototype.toString.call(type_8)) // '[object Function]' console.log(Object.prototype.toString.call(type_9)) // '[object Array]' console.log(Object.prototype.toString.call(type_10)) // '[object Object]' console.log(Object.prototype.toString.call(date)) // '[object Date]' console.log(Object.prototype.toString.call(map)) // '[object Map]' console.log(Object.prototype.toString.call(set)) // '[object Set]'
这样看来,Object.prototype.toString.call()还真是yyds!