в чем разница между typeof и instanceof в javascript

Аватар пользователя Ivan Gagarinov
Ivan Gagarinov
27 ноября 2024

Оператор typeof используется для определения типа переменной. Он возвращает строку, описывающую тип значения. Применение typeof довольно просто.

console.log(typeof "Hello"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (исторический баг, который сохраняется для совместимости)
console.log(typeof Symbol()); // "symbol"
console.log(typeof BigInt(123)); // "bigint"
console.log(typeof {}); // "object"
console.log(typeof []); // "object" (массивы – это объекты)
console.log(typeof function(){}); // "function"

Оператор instanceof используется для проверки того, является ли объект экземпляром определенного конструктора или класса. Он возвращает true, если объект находится в цепочке прототипов конструктора.

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

const arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true

Основные различия:

typeof используется для определения примитивного типа данных (строка, число, логическое значение и т.д.) и возвращает строковое представление типа. А instanceof используется для проверки принадлежности объекта к определенному классу или конструктору и проверяет цепочку прототипов.

typeof всегда возвращает строку. instanceof возвращает булево значение (true или false).

typeof может использоваться для проверки примитивных типов и определения типа функции или объекта, но не может эффективно проверять тип объектов, созданных с помощью пользовательских классов или конструкторов (например, проверка на массивы). instanceof полезен для определения объектов, которые являются экземплярами пользовательских классов или конструкций, а также для работы с встроенными объектами, такими как массивы и даты.

С typeof существует известная проблема с null, который возвращает 'object'. instanceof может давать неправильные результаты в случае, если объект был создан в другом контексте (например, если вы создаете экземпляр класса в одном iframe, а проверяете в другом).

0 0
Познакомьтесь с основами JavaScript бесплатно