JS判断数据类型的几种方式

JS中常见的几种数据类型

  1. 基本类型:string、boolean、number
  2. 特殊类型:undefined和null
  3. 3、引用类型:Array、Date、RegExp…

typeof

typeof检测基本数据类型时没有问题,但是当其对引用类型进行检测时,会返回object,这样就无法进行精准的判断,这样也不足为奇,因为所有的对象其原型链最终都指向了object
比如 typeof null --> object, 但是typeof undefined --> undefined,typeof new Function —> function,对于检测其他引用数据类型时都返回object

instanceof

用来判断A是否是B的实例,是的话就返回true,不是就返回false。当 A 的 _proto_ 指向 B 的 prototype 时,就认为A就是B的实例。
这种方式也是有问题的,比如他会认为 []也是Object的实例。
分析一下[]、Array、Object 三者之间的关系: 从instanceof 能够判断出 []._proto_ 指向 Array.prototype, 而 Array.prototype.proto 又指向了Object.prototype,Object.prototype._proto_ 指向了null,标志着原型链的结束。
于是得出一个结论,instanceof只能用来检测两个对象是否在一条原型链上,并不能检测出对象的具体类型。

constructor

当一个函数F被创建时,JS引擎会为其添加prototype原型,然后在原型上添加一个constructor属性,并让其指向F的引用。也就是说F.prototype.constructor === F // ---> true
当执行 var f = new F() 这时候F被当做构造函数使用,这时候F原型上的constructor就会被转移到了实例对象f上,f.constructor === F // --> true
在这里插入图片描述
注意;null和undefined是无效的对象,是不存在constructor这个属性的
但是constructor也是存在问题的,比如当我们重写了F的prototype之后,原有的constructor会丢失,此时F的实例对象f的constructor也不会再指向F,这时候的constructor会默认指向Object。
F.prototype = { a: 'test' }; var f = new F(); f.constructor == F;// false,但是f.constructor == Object; // true为什么呢???
因为F.prototype被重新赋值了 {},而{}是new Object()的一个实例对象,因此,new Object()会把其原型上的constructor传递给 {}
因此,为了规范,在重写对象原型时一般都需要重新给constructor赋值,以保证实例对象的类型不被改写。

Object.prototype.toString

toString 方法默认返回其调用者的具体类型,更严格的讲是toString运行时,this指向的对象类型。
但是需要注意的是,必须要通过Object.prototype.toString这种方法来查找,不能直接使用toString,从原型链的角度讲,所有对象的原型链最终都指向了Object,按照JS变量查找规则,其他对象也是可以直接访问到Object的toString方法的,但是事实上,大部分对象都已经实现了自身的toString方法,这样就可能导致Object的toString被终止查找,所以我们使用call方法来强制执行Object的toString方法。
Object.prototype.toString.call(’’) ; // [object String]
Object.prototype.toString.call(1) ; // [object Number]
Object.prototype.toString.call(true) ; // [object Boolean]
Object.prototype.toString.call(undefined) ; // [object Undefined]
Object.prototype.toString.call(null) ; // [object Null]
Object.prototype.toString.call(new Function()) ; // [object Function]
Object.prototype.toString.call(new Date()) ; // [object Date]
Object.prototype.toString.call([]) ; // [object Array]
Object.prototype.toString.call(new RegExp()) ; // [object RegExp]
Object.prototype.toString.call(new Error()) ; // [object Error]
Object.prototype.toString.call(document) ; // [object HTMLDocument]
Object.prototype.toString.call(window) ; //[object Window] window是全局对象global的引用

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页