在JS中,大家通常用typeof
来判断基本类型,instanceof
来判断引用类型。
typeof
typeof一般只能返回如下几个结果:number,boolean,string,function,object,undefined字符串
对于Array,null等特殊对象使用typeof一律返回object,而函数返回function这正是typeof的局限性。
在判断除Object类型的对象(基本类型)时比较方便。
instanceof
object instanceof constructor
instanceof 运算符用来测试一个对象在其原型链中是否存在一个构造函数的 prototype 属性。
换种说法就是左侧的对象是否是右侧对象的实例。
相关练习
1 | '123' instanceof String // true |
1 | // 都是Object的实例 true |
1 | function Foo(){} |
1 | console.log(String instanceof String); // flase |
instanceof实现
1 | function instance_of(L, R) {//L 表示左边的object,R 表示右边的constructor |
重点解析
__proto__ 属性,指向了创建该对象的构造函数的原型
所有JS对象都有 __proto__ 属性,除了Object.prototype.__proto__ === null
注意Object(),它是由function生成的,所以它的proto属性指向了function的构造器Function的原型Function.prototype
注意构造器Function,它是唯一一个prototype和proto指向相同的对象
一般来说,我们日常自行创建的构造器Foo的proto属性指向function的构造器Function的原型Function.prototype,但是构造器的原型对象Foo.prototype的proto属性是直接指向Object.prototype对象的