js中判断数据类型的四种方法总结

js中判断数据类型的四种方法

前言

  在js中,咱们常常须要判断数据的类型,那么哪些方法能够用来判断数据的类型呢?哪一种方法判断数据类型最准确呢?面试

咱们来一个个分析:
app

1.typeof

  typeof是一个运算符,使用方式有两种:1.typeof(表达式)2.typeof 变量名。返回值为表示类型的字符串。能判断的类型有函数

  Number、String、Boolean,Undefined、Object、Function、Symbol等spa

  实例详解:prototype

  

 注意最后两个typeof null typeof [] 返回的都是object。能够看出typeof并不能准确的判断出array和null。对象

结论:blog

  typeof 对对象类型的值的类型不能做出准确判断,能准确判断出基本数据类型的值!原型链

2.instanceof

  A instanceof B 判断 A 是否为 B 的实例,若是是,则返回 true,不是则返回 false。instanceof检测的是原型,内部机制其实就是判断对象 A 的原型链中是否有 B 的原型。字符串

  实例详解:原型

 

从上面的实例咱们能够看出,基本数据类型的值不能用 instanceof 判断类型,因为undefined和null没有构造函数,因此使用 instanceof 会报错!而由基本数据包装类建立的对象能够用 instanceof 判断类型。

结论:

  instanceof 只能用于判断对象,基本数据类型值不能判断,因此也不能准确的判断出全部的类型!

3.constructor 

   当一个函数F被定义时,JS引擎会为F添加prototype原型,而后在prototype上添加一个constructor属性,并让其指向F的引用,F利用原型对象的constructor属性引用了自身,当F做为构造函数建立对象时,原型上的constructor属性被遗传到了新建立的对象上,从原型链角度讲,构造函数F就是新对象的类型。这样作的意义是,让对象诞生之后,就具备可追溯的数据类型。

  

从实例咱们能够看出:constructor判断undefined和null时,会报错。

结论:

  constructor能判断基本数据类型string、number、boolean和对象类型(array、function等等),可是它不能判断undefined和null。因此它判断类型值也不十分准确!

 

 

4.Object.prototype.toString.call()(最准确的判断类型的方法,推荐使用,也是面试官想要的答案!!!)

  toString()是Object的原型方法,调用该方法,默认返回当前对象的[[Class]]。这是一个内部属性,其格式为[object Xxx],其中Xxx就是对象的类型。

  对于Object对象,直接调用toString()就能返回[object Object],而对于其余对象,则须要经过call、apply来调用才能返回正确的类型信息。

 

  

  从实例咱们能够看出该方法能判断基本类型也能判断 Array 和 Function。

  对于Object对象:

  

  实例可见,对于Object对象,能够直接使用 toString() 方法,对于其余内置对象,Object.prototype.toString.call() 方法都能准确的判断出其类型。

  结论:

    Object.prototype.toString.call() 方法是判断类型的最准确的方法!

总结:

  要判断一个值的类型,最准确的方法就是Object.prototype.toString.call()