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