Sobes.tech
Junior
148
questionbank

Что проверяет оператор instanceof в JavaScript?

Ответ от нейросети

sobes.tech AI

Оператор instanceof в JavaScript проверяет, является ли объект экземпляром определенного класса или конструктора.

Принцип работы:

  1. Оператор instanceof проверяет наличие prototype конструктора в цепочке прототипов объекта.
  2. Если prototype конструктора присутствует в цепочке, результат true.
  3. В противном случае результат false.

Примеры:

// Создаем класс
class Animal {
  // Конструктор
  constructor(name) {
    this.name = name;
  }
}

// Создаем экземпляр класса
let dog = new Animal("Buddy");

// Проверяем, является ли dog экземпляром Animal
console.log(dog instanceof Animal); // true

// Проверяем, является ли dog экземпляром Object (он является, через цепочку прототипов)
console.log(dog instanceof Object); // true

// Проверяем, является ли dog экземпляром Array (он не является)
console.log(dog instanceof Array); // false

// Проверка с встроенными типами
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true

let num = 123;
console.log(num instanceof Number); // false (для примитивов instanceof ведет себя специфично)
// Для примитивов, созданных через new
let numObj = new Number(123);
console.log(numObj instanceof Number); // true

Особенности:

  • instanceof работает через цепочку прототипов, поэтому результат может быть true для родительских конструкторов.
  • Для примитивных типов (string, number, boolean, null, undefined, symbol, bigint), instanceof обычно возвращает false, если они не были созданы через соответствующий объект-обертку (new String(), new Number() и т.д.).
  • Может быть неточным при работе с разными контекстами выполнения JavaScript (например, разными окнами браузера или iframe), так как каждый контекст имеет свои собственные конструкторы.

Аналогичные подходы для проверки типа:

  • typeof: Возвращает строку, указывающую на базовый тип данных (string, number, boolean, object, function, undefined, symbol, bigint). Не подходит для проверки принадлежности к конкретному классу.
  • Object.prototype.toString.call(): Возвращает более точную строку с типом объекта ("[object Array]", "[object Date]" и т.д.).

В целом, instanceof полезен для проверки принадлежности объекта к конкретному классу или его предку в иерархии наследования.