判断javascript中的数据类型

JS中引用数据类型

JS 中的数据类型有好些,很多时候,我们需要判断其类型,从而决定 代码的具体的执行逻辑

那么如何快速准确的判断JS中的类型呢

本节我们要总结四种判断数据类型的方法

特别注意:每个方法都有相应的坑,但愿你不要踩到

第一种:typeof

typeof 用来判断 数据类型,我们先看下面表

 

 

总结一:

只能准确的判断基本类型(除Null),对于 引用类型,只能区分 Objectfunction,无法区别 Array,等其他类型

总结二:

为什么基本类型中的null的类型是 Object?

这个问题其实在前面的一篇文章已经阐述过了,是因为 最初世界上的机器基本都是 32位的机器

typeof 内部是根据每个变量在内存中的地址 前两位数字来判断 数据类型的,而最初的 null是 也是 0 开头

参考

 

 所以此处在类型判断的时候一定要注意Null的特殊情况,它虽然是 Object,但确实是 基本数据类型

总结三:

Function类型比较特殊,虽然它其实还是 Object,但用 typeof测试,却是 Function,但是 像Array

其他继承于 Object的 引用类型 却统一是 Object

第二种: instanceof

instanceof 可以正确判断对象的类型,其内部运行机制是判断在其原型链中能否找到该类型的原型

所以它可以用来判断引用类型,但是对于基本类型却无能为力

 

 注意: null 类型 用 instanceof 无法判断,因为 null是原型链的最顶层了

如何实现一个 instanceof

知道了它的原理,就很简单了

只要递归的拿它的原型链去对比就可以了

 

 

第三种:constructor

constructor 主要是获取当前实例的构造函数

通过该对象的构造函数 是否是 哪个值,从而知道该对象的类型

此方法对 string 也是有效的,如下图试验

 

 

但是

  1. 如果你自己定义的一个构造函数,那么它产生的实例。再用上文中 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
  1. null 也是无法通过 constructor 来判断类型的,因为 null 没有constructor 属性

第四种:Object.prototype.toString.call()

此方法返回一个表示该对象的字符串 , 比如 [Object string],后面的 string 就真正的类型

这个方法 必须使用 Object.prototype.toString.call(),因为 像 数组和函数,一般都会 自己去实现 自己的

toString方法,这样的话,就覆盖了原型上面的 toSting 方法

这个方法的好处是,不管是 基本类型,还是引用类型,都能识别到,算是 目前为止判断类型的最优解了

 

 但是,但是 由于 javascrippt还是太随意了,toString方法也是可以直接修改的

 

 

总结

本文主要介绍了javaScript中的四种判断类型的方法

  • typeof , 判断基本类型够用,无法识别具体的 引用类型(除function)
  • instanceof,判断一个值的原型链是否有 某个值,只能识别到 引用类型,对于基本类型无效
  • constructor,获取值得构造函数,从而判断类型,能判断 引用类型 和 基本类型,但是 如果引用类型是个自定义的类型,那么只能判断到 它自身的 构造函数,无法在原型链上去搜索
  • Object.prototype.toString.call() 能准确的判断出 基本类型和引用类型

注意:以上所有的方法,都可以直接修其 函数的定义。这种情况是 语言特性决定的

所有最优解还是 Object.prototype.toString.call()


作者:三年三月
链接:https://juejin.cn/post/7142830974395645966
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
posted @ 2022-09-14 20:40  当下是吾  阅读(41)  评论(0编辑  收藏  举报