в чем разница между typeof и instanceof в javascript
Оператор 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, а проверяете в другом).