返回顶部

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!

  

posted on 2022-03-10 18:04  孤僻而冷漠  阅读(268)  评论(0编辑  收藏  举报

导航