Кратко
СкопированоОператор instanceof проверяет, принадлежит ли объект определённому классу или конструктору. Он возвращает true, если объект был создан с помощью этого конструктора или наследуется от него.
Пример
СкопированоКак пишется
Скопированоinstanceof — это бинарный оператор. Он проверяет цепочку прототипов объекта и ищет в ней свойство prototype указанного конструктора:
объект instanceof Конструктор
объект instanceof Конструктор
JavaScript поднимается по цепочке прототипов объекта и проверяет, встречается ли там Конструктор. Если встречается — возвращает true, если дошёл до конца цепочки и не нашёл — false.
class Animal {}class Dog extends Animal {}const rex = new Dog()rex instanceof Dog // true — в цепочке есть Dog.prototyperex instanceof Animal // true — в цепочке есть Animal.prototyperex instanceof Object // true — в цепочке есть Object.prototype
class Animal {}
class Dog extends Animal {}
const rex = new Dog()
rex instanceof Dog // true — в цепочке есть Dog.prototype
rex instanceof Animal // true — в цепочке есть Animal.prototype
rex instanceof Object // true — в цепочке есть Object.prototype
Как понять
СкопированоДля чего нужен
Скопированоinstanceof помогает определить, с каким именно объектом мы работаем. Это особенно полезно, когда нужно отличить один тип объекта от другого:
function process(value) { if (value instanceof Array) { // Обрабатываем массив return value.map(item => item * 2) } if (value instanceof Date) { // Обрабатываем дату return value.toLocaleString() } if (value instanceof Promise) { // Обрабатываем промис return value.then(data => data) } return value}
function process(value) {
if (value instanceof Array) {
// Обрабатываем массив
return value.map(item => item * 2)
}
if (value instanceof Date) {
// Обрабатываем дату
return value.toLocaleString()
}
if (value instanceof Promise) {
// Обрабатываем промис
return value.then(data => data)
}
return value
}
Примитивы и объекты
Скопированоinstanceof работает только с объектами. Для примитивов он всегда возвращает false:
42 instanceof Number // false"строка" instanceof String // falsetrue instanceof Boolean // false// Но если создать через конструктор — truenew Number(42) instanceof Number // truenew String("строка") instanceof String // true
42 instanceof Number // false
"строка" instanceof String // false
true instanceof Boolean // false
// Но если создать через конструктор — true
new Number(42) instanceof Number // true
new String("строка") instanceof String // true
Наследование
Скопированоinstanceof учитывает наследование — если класс наследует от другого класса, проверка вернёт true для обоих:
class Vehicle {}class Car extends Vehicle {}const tesla = new Car()tesla instanceof Car // truetesla instanceof Vehicle // truetesla instanceof Object // true
class Vehicle {}
class Car extends Vehicle {}
const tesla = new Car()
tesla instanceof Car // true
tesla instanceof Vehicle // true
tesla instanceof Object // true
Массивы
СкопированоМассивы — это объекты, поэтому instanceof работает, но и instanceof тоже вернёт true:
[1, 2, 3] instanceof Array // true[1, 2, 3] instanceof Object // true
[1, 2, 3] instanceof Array // true
[1, 2, 3] instanceof Object // true
Чтобы точно проверить массив, лучше использовать Array:
Array.isArray([1, 2, 3]) // true
Array.isArray([1, 2, 3]) // true
Функции-конструкторы
Скопированоinstanceof работает и со старыми функциями-конструкторами:
function Person(name) { this.name = name}const alice = new Person("Алиса")alice instanceof Person // truealice instanceof Object // true
function Person(name) {
this.name = name
}
const alice = new Person("Алиса")
alice instanceof Person // true
alice instanceof Object // true
Ошибки
Скопированоinstanceof отлично работает с ошибками:
try { // что-то ломается} catch (error) { if (error instanceof TypeError) { console.log("Ошибка типа!") } else if (error instanceof RangeError) { console.log("Выход за пределы!") } else { console.log("Другая ошибка") }}
try {
// что-то ломается
} catch (error) {
if (error instanceof TypeError) {
console.log("Ошибка типа!")
} else if (error instanceof RangeError) {
console.log("Выход за пределы!")
} else {
console.log("Другая ошибка")
}
}
Подсказки
Скопировано💡 instanceof проверяет наследование, а не просто конструктор. Если объект был создан с помощью Object с другим прототипом — поведение может отличаться.
💡 Для примитивов используйте typeof, для объектов — instanceof.
💡 instanceof может сломаться, если объект был передан между разными фреймами или iframe — там свои глобальные объекты и цепочки прототипов.
💡 В современном коде вместо instanceof для проверки конкретных типов часто используют проверку наличия методов: if для промисов или if для массивов.
💡 instanceof работает с любыми функциями, у которых есть свойство prototype.