JS中常见的几种数据类型
- 基本类型:string、boolean、number
- 特殊类型:undefined和null
- 3、引用类型:Array、Date、RegExp…
typeof
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
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/211091.html原文链接:https://javaforall.net

