instanceof 运算符是用来检测某个实例对象的原型链上是否存在构造函数的 prototype 属性。
    通常用 typeof 来判断基本类型,用 instanceof 来判断引用类型。

    instanceof 的源码:

    1. function myInstanceof (instanceObj, constructorFun) {
    2. const prototypeObj = constructorFun.prototype; // 获取构造函数的原型对象
    3. instanceObj = instanceObj.__proto__; // 获取实例对象的原型
    4. while(instanceObj) {
    5. if (instanceObj === prototypeObj) {
    6. return true;
    7. }
    8. instanceObj = instanceObj.__proto__;
    9. }
    10. return false;
    11. }

    语法: object instanceof constructor

    有趣的例子:

    1. function Foo() {
    2. }
    3. Object instanceof Object // true
    4. Function instanceof Function // true
    5. Function instanceof Object // true
    6. Foo instanceof Foo // false
    7. Foo instanceof Object // true
    8. Foo 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) 才是。

    1. Object.prototype.toString.call({})
    2. // '[object Object]'
    3. Object.prototype.toString.call([])
    4. // '[object Array]'
    5. Object.prototype.toString.call(() => {})
    6. // '[object Function]'
    7. Object.prototype.toString.call('wangergou')
    8. // '[object String]'
    9. Object.prototype.toString.call(null)
    10. // '[object Null]'
    11. Object.prototype.toString.call(undefined)
    12. // '[object Undefined]'

    参考链接: