判断javascript中的数据类型
JS中引用数据类型
JS 中的数据类型有好些,很多时候,我们需要判断其类型,从而决定 代码的具体的执行逻辑
那么如何快速准确的判断JS
中的类型呢
本节我们要总结四种判断数据类型的方法
特别注意:每个方法都有相应的坑,但愿你不要踩到
第一种:typeof
typeof
用来判断 数据类型,我们先看下面表
总结一:
只能准确的判断基本类型(除Null
),对于 引用类型,只能区分 Object
和function
,无法区别 Array
,等其他类型
总结二:
为什么基本类型中的null
的类型是 Object
?
这个问题其实在前面的一篇文章已经阐述过了,是因为 最初世界上的机器基本都是 32位的机器
typeof
内部是根据每个变量在内存中的地址 前两位数字来判断 数据类型的,而最初的 null
是 也是 0 开头
![](https://img2022.cnblogs.com/blog/1560517/202209/1560517-20220914203655773-1717158331.png)
所以此处在类型判断的时候一定要注意Null
的特殊情况,它虽然是 Object
,但确实是 基本数据类型
总结三:
Function
类型比较特殊,虽然它其实还是 Object
,但用 typeof
测试,却是 Function
,但是 像Array
等
其他继承于 Object
的 引用类型 却统一是 Object
第二种: instanceof
instanceof
可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型
所以它可以用来判断引用类型,但是对于基本类型却无能为力
![](https://img2022.cnblogs.com/blog/1560517/202209/1560517-20220914203733061-105834300.png)
注意: null
类型 用 instanceof
无法判断,因为 null
是原型链的最顶层了
如何实现一个 instanceof
知道了它的原理,就很简单了
只要递归的拿它的原型链去对比就可以了
第三种:constructor
constructor 主要是获取当前实例的构造函数
通过该对象的构造函数 是否是 哪个值,从而知道该对象的类型
此方法对 string
也是有效的,如下图试验
但是
- 如果你自己定义的一个构造函数,那么它产生的实例。再用上文中
instanceof
测试,是无法得到Object
,而只能得到 你自己写的那个构造函数
class Person { constructor(name) { this.name = name } getName(){ console.log('我的名字叫',this.name) } } let p = new Person('三年三月') p.getName() console.log('p的类型是否是 Object',p.constructor === Object) // false console.log('通过instanceof 可以,因为原型链上有 Object'p instanceof Object) // true
null
也是无法通过constructor
来判断类型的,因为null
没有constructor
属性
第四种:Object.prototype.toString.call()
此方法返回一个表示该对象的字符串 , 比如 [Object string]
,后面的 string 就真正的类型
这个方法 必须使用 Object.prototype.toString.call()
,因为 像 数组和函数,一般都会 自己去实现 自己的
toString
方法,这样的话,就覆盖了原型上面的 toSting
方法
这个方法的好处是,不管是 基本类型,还是引用类型,都能识别到,算是 目前为止判断类型的最优解了
![](https://img2022.cnblogs.com/blog/1560517/202209/1560517-20220914203958745-519220206.png)
但是,但是 由于 javascrippt
还是太随意了,toString
方法也是可以直接修改的
总结
本文主要介绍了javaScript
中的四种判断类型的方法
typeof
, 判断基本类型够用,无法识别具体的 引用类型(除function)instanceof
,判断一个值的原型链是否有 某个值,只能识别到 引用类型,对于基本类型无效constructor
,获取值得构造函数,从而判断类型,能判断 引用类型 和 基本类型,但是 如果引用类型是个自定义的类型,那么只能判断到 它自身的 构造函数,无法在原型链上去搜索Object.prototype.toString.call()
能准确的判断出 基本类型和引用类型
注意:以上所有的方法,都可以直接修其 函数的定义。这种情况是 语言特性决定的
所有最优解还是 Object.prototype.toString.call()
作者:三年三月
链接:https://juejin.cn/post/7142830974395645966
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。