ZetCode

JavaScript instanceof 关键字

最后修改于 2025 年 4 月 16 日

在本文中,我们将展示如何使用 JavaScript 中的 instanceof 运算符来检查对象类型。

instanceof 运算符

instanceof 运算符测试一个对象是否属于特定类或构造函数。如果对象是指定类型的实例,则返回 true,否则返回 false

该运算符检查对象原型链中是否存在构造函数的原型。这使其对于检查 JavaScript 中的继承关系非常有用。与 typeof 不同,它适用于自定义对象类型。

语法为 object instanceof constructor。左操作数是要测试的对象,右操作数是要测试的构造函数。

instanceof 的基本用法

以下示例演示了 instanceof 运算符与内置类型的基本用法。

main.js
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 运算符也适用于用户定义的类。

main.js
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 更具体的类型检查。

main.js
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 类。

main.js
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 和继承

该运算符正确地识别了复杂层次结构中的继承关系。

main.js
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 时,需要注意一些边缘情况。

main.js
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 进行运行时类型检查的实际例子。

main.js
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 - 语言参考

在本文中,我们演示了如何使用 instanceof 运算符来检查 JavaScript 中的对象类型和继承关系。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。到目前为止,我撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

查看 所有 JavaScript 教程。