js中的instanceof运算符

 MDN给出的解释是:

  instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。

       看到这里我们就明白了instanceof是与原型和原型链有关系的,在弄懂instanceof之前我们就必须要了解什么是原型和原型链,关于原型和原型链详细的解释可以翻看我的另一篇博客彻底理解js的原型和原型链

 语法:

       object instanceof constructor 

    object         ——> 某个实例对象

    constructor ——>某个构造函数

   实例:

// 定义构造函数
function C(){}
function D(){}

//实例化对象 var o = new C(); o instanceof C; // true,因为 Object.getPrototypeOf(o) === C.prototype o instanceof D; // false,因为 D.prototype 不在 o 的原型链上 o instanceof Object; // true,因为 Object.prototype.isPrototypeOf(o) 返回 true C.prototype instanceof Object; // true,同上 C.prototype = {}; var o2 = new C(); o2 instanceof C; // true o instanceof C; // false,C.prototype 指向了一个空对象,这个空对象不在 o 的原型链上. D.prototype = new C(); // 继承 var o3 = new D(); o3 instanceof D; // true o3 instanceof C; // true 因为 C.prototype 现在在 o3 的原型链上

  辨析instanceof和typeof:

  instanceof的功能类似于typeof,都是判断类型。对于值的类型,如string/number/boolean我们都可以通过typeof判断,但是typeof在判断引用类型时,返回值只有object/function,你不知道它到底是一个object对象,还是数组,还是new Number等等。听着还是有点模糊,那么我们通过一段代码来更好的理解typeof的判断类型是什么

   var a = 18;
    var b = 'smile';
    var c = true;
    var d = [];
    var e = {};
    function f() {

    }

    console.log(typeof (a));//number
    console.log(typeof (b));//string
    console.log(typeof (c));//boolean
    console.log(typeof (d));//object
    console.log(typeof (e));//object
    console.log(typeof (f));//function

 

  那么instanceof又是怎么判断的呢?

  我们先假设有一个函数A,A有一个实例化对象a,instanceof的判断规则是沿着a的__proto__这条线去找,同时沿着A的prototype这条线去找,如果两条线能找到同一个引用,即同一个对象,就返回true,如果找到终点还没有重合就返回false.同样,我们也将通过一段代码来理解instance的判断类型

   function A() {

    }
    var a = new A();
    var b = [];

    console.log(a instanceof A);//true
    console.log(A instanceof Function);//true
    console.log(b instanceof Array);//true
    console.log(a instanceof Array);//false