JavaScript instanceof 关键字
最后修改于 2025 年 4 月 16 日
在本文中,我们将展示如何使用 JavaScript 中的 instanceof 运算符来检查对象类型。
instanceof 运算符
instanceof 运算符测试一个对象是否属于特定类或构造函数。如果对象是指定类型的实例,则返回 true,否则返回 false。
该运算符检查对象原型链中是否存在构造函数的原型。这使其对于检查 JavaScript 中的继承关系非常有用。与 typeof 不同,它适用于自定义对象类型。
语法为 object instanceof constructor。左操作数是要测试的对象,右操作数是要测试的构造函数。
instanceof 的基本用法
以下示例演示了 instanceof 运算符与内置类型的基本用法。
const arr = [1, 2, 3]; const date = new Date(); console.log(arr instanceof Array); // true console.log(date instanceof Date); // true console.log(arr instanceof Object); // true console.log(date instanceof Object); // true console.log(arr instanceof Date); // false
这表明数组是 Array 和 Object 的实例,但不是 Date 的实例。所有对象在 JavaScript 中都继承自 Object。该运算符正确地识别了对象的类型及其继承链。
$ node main.js true true true true false
instanceof 与自定义类
instanceof 运算符也适用于用户定义的类。
class Animal {}
class Dog extends Animal {}
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
此示例演示了继承检查。Dog 实例也是 Animal 和 Object 的实例。该运算符遍历整个原型链以确定关系。
$ node main.js true true true
instanceof vs typeof
instanceof 运算符提供比 typeof 更具体的类型检查。
const arr = [1, 2, 3];
const obj = {};
console.log(typeof arr); // "object"
console.log(typeof obj); // "object"
console.log(arr instanceof Array); // true
console.log(obj instanceof Array); // false
虽然 typeof 对数组和普通对象都返回 "object",但 instanceof 可以区分它们。这使得 instanceof 对于对象的精确类型检查更有用。
$ node main.js object object true false
instanceof 与构造函数
该运算符适用于传统的构造函数,而不仅仅是 ES6 类。
function Person(name) {
this.name = name;
}
const john = new Person('John');
console.log(john instanceof Person); // true
console.log(john instanceof Object); // true
console.log(john instanceof Array); // false
这表明 instanceof 与函数构造函数一样适用于类。该运算符检查由构造函数创建的原型链。
$ node main.js true true false
instanceof 和继承
该运算符正确地识别了复杂层次结构中的继承关系。
class Vehicle {}
class Car extends Vehicle {}
class SportsCar extends Car {}
const myCar = new SportsCar();
console.log(myCar instanceof SportsCar); // true
console.log(myCar instanceof Car); // true
console.log(myCar instanceof Vehicle); // true
console.log(myCar instanceof Object); // true
这个多级继承示例显示了 instanceof 检查整个原型链。SportsCar 也是 Car、Vehicle 和 Object。
$ node main.js true true true true
instanceof 的边缘情况
在使用 instanceof 时,需要注意一些边缘情况。
console.log(null instanceof Object); // false
console.log(undefined instanceof Object); // false
console.log(123 instanceof Number); // false
console.log('text' instanceof String); // false
console.log(true instanceof Boolean); // false
const numObj = new Number(123);
console.log(numObj instanceof Number); // true
原始值不是对象,因此它们返回 false。只有原始值的对象版本(使用构造函数创建)才返回 true。Null 和 undefined 始终返回 false,因为它们没有原型链。
$ node main.js false false false false false true
实际用例:函数中的类型检查
这是一个使用 instanceof 进行运行时类型检查的实际例子。
class User {
constructor(name) {
this.name = name;
}
}
class Admin extends User {
constructor(name, level) {
super(name);
this.level = level;
}
}
function greet(user) {
if (user instanceof Admin) {
console.log(`Hello Admin ${user.name} (level ${user.level})`);
} else if (user instanceof User) {
console.log(`Hello ${user.name}`);
} else {
console.log('Invalid user type');
}
}
const regular = new User('John');
const admin = new Admin('Jane', 5);
greet(regular);
greet(admin);
greet({});
此函数的行为取决于传递给它的 user 的类型。instanceof 检查允许基于对象在继承层次结构中的类型的多态行为。
$ node main.js Hello John Hello Admin Jane (level 5) Invalid user type
来源
在本文中,我们演示了如何使用 instanceof 运算符来检查 JavaScript 中的对象类型和继承关系。