instanceof
是 JavaScript 中的一个操作符,用于检测一个对象是否在其原型链上有构造函数 prototype
属性。换句话说,instanceof
用来判断一个变量是否是一个特定构造函数的实例。
当你使用 instanceof
操作符时,它会检查左边操作数的原型链中是否包含右边操作数的 prototype
属性。如果是,则返回 true
;否则返回 false
。
语法
object instanceof constructor
object
:要检测的对象。constructor
:函数或者类,其prototype
属性将被用作原型链中的一部分进行查找。
示例
function Car(make, model) { this.make = make; this.model = model;
} const myCar = new Car("Ford", "Mustang"); console.log(myCar instanceof Car); // true,因为 myCar 是 Car 的实例
console.log(myCar instanceof Object); // true,因为所有对象都是 Object 的实例(或其子类的实例) // 内置对象类型检测
console.log([] instanceof Array); // true
console.log({} instanceof Object); // true
console.log(new Date() instanceof Date); // true // 注意:基本类型(如 string, number, boolean)不是对象,所以 instanceof 不会返回 true
console.log("Hello" instanceof String); // false
console.log(42 instanceof Number); // false
console.log(true instanceof Boolean); // false
console.log(null instanceof Object); // false
console.log(undefined instanceof Object); // false // 但是,如果你使用了基本类型的包装对象,情况就不同了
console.log(new String("Hello") instanceof String); // true
注意事项
instanceof
操作符对于基本数据类型(如Number
、String
、Boolean
)和null
、undefined
不适用,因为基本数据类型不是对象,而null
和undefined
也没有原型链。
手写instanceof
function myInstanceOf(obj, constructor) {// 首先检查 obj 是否为 null 或 undefined,因为这两种类型没有原型链 if (!obj || typeof obj !== 'object') {return false}// 获取 obj 的原型let proto = Object.getPrototypeOf(obj)while (proto) {// 如果原型等于构造函数的原型,则返回 trueif (proto === constructor.prototype) {return true}proto = Object.getPrototypeOf(proto)}return false
}// 示例
function Car(make, model) {this.make = make;this.model = model;
}const myCar = new Car('Ford', 'Mustang');console.log(myInstanceOf(myCar, Car)); // true
console.log(myInstanceOf(myCar, Object)); // true
console.log(myInstanceOf(null, Object)); // false
console.log(myInstanceOf(undefined, Object)); // false
console.log(myInstanceOf(5, Number)); // false