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 中的对象类型和继承关系。