instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。
语法
object instanceof Constructorobject //某个实例对象
Constructor //某个构造函数
实例验证
验证的过程中会使用Object.getPrototypeOf(Object),Object.getPrototypeOf() 方法返回指定对象的原型(内部[[Prototype]]属性的值)。
function F1(){}
function F2(){}let f1 = new F1();f1 instanceof F1 //true,因为 Object.getPrototypeOf(f1) === F1.prototype
f1 instanceof F2 //false,因为 F2.prototype 不在 f1 的原型链上f1 instanceof Object; // true,因为 Object.prototype.isPrototypeOf(f1) 返回 true
F1.prototype instanceof Object // true,同上
但 f1 instanceof F1 并不是永远返回 true的。在实例中,function F1(){}创建了一个名为F1的函数,let f1 = new F1()创建了一个名为 f1 的 F1 实例,即 f1 继承 F1。 F1.prototype 指向了一个对象,这个对象在 f1 的原型链上,Object.getPrototypeOf(f1) === F1.prototype可以验证这一点。如果我们修改了 F1.prototype 的值,f1 instanceof F1就可能为 false
F1.prototype = {}
f1 instanceof F1 //false
当 F1.prototype指向了一个空对象,这个空对象就不再存在于 f1 的原型链上了。我们需要明确这一点,f1 instanceof F1 === false并不是因为 F1.prototype为空,而是因为F1.prototype不在 f1 的原型链上。
let f3 = new F1()
f1 instanceof F1 //false
f3 instanceof F1 //true
以此类推,修改f3.proto的值也有异曲同工的效果
f3.__proto__ = {}
f3 instanceof F1 //false
特殊情况
instanceof 左边类型不为 object 的情况
object instanceof constructor,如果左侧不是 object,return false。
1 instanceof Number //falselet a = new Number(1);
a instanceof Number // true
String 对象和 Date 对象都属于 Object 类型和一些特殊情况
String 和 Date 对象 同时也属于 Object 类型(他们是由Object类派生出来的)
但是,使用对象文字符号创建的对象在这里是一个例外:虽然原型未定义,但 instanceof Object 返回 true。
var simpleStr = "This is a simple string";
var myString = new String();
var newStr = new String("String created with constructor");
var myDate = new Date();
var myObj = {};
var myNonObj = Object.create(null); //一种创建非 Object 实例的对象的方法simpleStr instanceof String; // 返回 false, 非对象实例,因此返回 false
myString instanceof String; // 返回 true
newStr instanceof String; // 返回 true
myString instanceof Object; // 返回 truemyObj instanceof Object; // 返回 true, 尽管原型没有定义
({}) instanceof Object; // 返回 true, 同上
myNonObj instanceof Object; // 返回 false, myString instanceof Date; //返回 falsemyDate instanceof Date; // 返回 true
myDate instanceof Object; // 返回 true
myDate instanceof String; // 返回 false
判断自身的情况
使用 instanceof 用于判断对象类型时,以下情况都为 false
Number instanceof Number // false
String instanceof String //false
null instanceof Object // false null不具有任何对象的特性,也没有__proto__属性