Sobes.tech
Junior

Какво проверява операторът instanceof в JavaScript?

sobes.tech AI

Отговор от 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 е полезен за проверка дали обект принадлежи към конкретен клас или негов предшественик в йерархията на наследяване.