instanceof 运算符是用来检测某个实例对象的原型链上是否存在构造函数的 prototype 属性。
通常用 typeof 来判断基本类型,用 instanceof 来判断引用类型。
instanceof 的源码:
function myInstanceof (instanceObj, constructorFun) {const prototypeObj = constructorFun.prototype; // 获取构造函数的原型对象instanceObj = instanceObj.__proto__; // 获取实例对象的原型while(instanceObj) {if (instanceObj === prototypeObj) {return true;}instanceObj = instanceObj.__proto__;}return false;}
语法: object instanceof constructor
有趣的例子:
function Foo() {}Object instanceof Object // trueFunction instanceof Function // trueFunction instanceof Object // trueFoo instanceof Foo // falseFoo instanceof Object // trueFoo instanceof Function // true
Object instanceof Object:Object 的 prototype 属性是 Object.prototype ,而由于 Object 本身是一个函数,由
Function 所创建,所以 Object. proto_ 的值是 Function.prototype ,而 Function.prototype 的 proto 属性是 Object.prototype 。所以 Object instance Object 的结果为 true 。
但是 instanceof 并不是最好的判断 js 数据类型的解决方案。
Object.prototype.toString.call(xxx) 才是。
Object.prototype.toString.call({})// '[object Object]'Object.prototype.toString.call([])// '[object Array]'Object.prototype.toString.call(() => {})// '[object Function]'Object.prototype.toString.call('wangergou')// '[object String]'Object.prototype.toString.call(null)// '[object Null]'Object.prototype.toString.call(undefined)// '[object Undefined]'
参考链接:
