欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JavaScript数据类型检测

程序员文章站 2022-06-05 08:05:51
...

JavaScript共有四种数据检测方法,最优解决方案为Object.prototype.toString.call()

一、typeof

typeof 操作符返回一个字符串,表示未经计算的操作数的类型。

语法

typrof后接操作数,可以用括号括起来,也可以不用。

typeof operand
typeof(operand)
解释

typeof仅能用于检测基本数据类型的值,其返回值为表示当前数据类型的字符串。在JavaScript中,null被认为是空对象,因此typeof null的返回值为 ‘object’。

typeof后面出现非基本数据类型的话,返回值均为 ‘object’。

二、instanceof

instanceof并非专用于检测数据类型,它的实际作用是:检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

语法

instanceof操作符前面为被检测对象,后面为构造函数。

object instanceof constructor
解释

instanceof只能用来判断一个操作数是否是另一个操作数的实例,而不能判断被检测数到底是什么数据类型。

并且,在实际使用中还存在页面上由两个全局执行环境的情况。这是instanceof会无法判断其结果。例如:当前页面存在全局执行环境A和全局执行环境B,在A中创建一个数组再传递给执行环境B,那么在B中执行instanceof时,会默认用执行环境B中的Array来进行比较,这样就无法判断出A传递的数据类型是否正确。

三、constructor

constructor是指数据的构造函数。按照JavaScript的规则,当一个变量被定义后,会为其添加prototype,其中包含了constructor属性,constructor属性的值是对该变量构造函数的引用。因此从原理上来说,constructor是可以判断数据类型的,但实际上它并不实用,原因有以下两点:

  1. null和undefined在JavaScript中无效对象,不存在constructor。
  2. 因为JavaScript是灵活数据类型,所以JavaScript是允许开发者重写prototype的,一旦被重写后,constructor也就没有作用了。

四、Object.prototype.toString.call()

这一方法实际上是对被操作数调用Object的toString方法,应为Object的toString()方法默认会返回当前对象的类。其他数据类型自身的toString方法多少都被重写了。使用Object.prototype.toString.call()返回的结果如下:

Object.prototype.toString.call('') ;  // [object String]
Object.prototype.toString.call(1) ;   // [object Number]
Object.prototype.toString.call(true) ;// [object Boolean]
Object.prototype.toString.call(Symbol());//[object Symbol]
Object.prototype.toString.call(undefined) ;// [object Undefined]
Object.prototype.toString.call(null) ;// [object Null]
Object.prototype.toString.call(newFunction()) ;// [object Function]
Object.prototype.toString.call(newDate()) ;// [object Date]
Object.prototype.toString.call([]) ;// [object Array]
Object.prototype.toString.call(newRegExp()) ;// [object RegExp]
Object.prototype.toString.call(newError()) ;// [object Error]
Object.prototype.toString.call(document) ;// [object HTMLDocument]
Object.prototype.toString.call(window) ;//[object global] window 是全局对象 global 的引用