В чём разница между операторами typeof и instanceof?
При работе с JavaScript разработчики часто сталкиваются с необходимостью определения типа переменных. Два основных оператора, которые помогают в этом, — это typeof и instanceof. Несмотря на то, что оба служат для определения типа, они функционируют по-разному и применяются в различных ситуациях.
Оператор typeof
typeof — это унарный оператор, который возвращает строку, описывающую тип операнда. Он может использоваться с любыми переменными, включая примитивные типы и объекты.
Примеры использования:
console.log(typeof "Hello, World!"); // "string"
console.log(typeof 42); // "number"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (это известная особенность)
console.log(typeof {}); // "object"
console.log(typeof []); // "object" (массивы также являются объектами)
console.log(typeof function() {}); // "function"
Оператор instanceof
instanceof — это оператор, который проверяет, является ли объект экземпляром определённого конструктора или класса. Он возвращает логическое значение true или false.
Примеры использования:
class Animal {}
class Dog extends Animal {}
const dog = new Dog();
console.log(dog instanceof Dog); // true
console.log(dog instanceof Animal); // true
console.log(dog instanceof Object); // true
console.log(dog instanceof String); // false
Ключевые различия
-
Тип возвращаемого значения:
typeofвозвращает строку, описывающую тип.instanceofвозвращает логическое значение.
-
Применение:
typeofлучше подходит для проверки примитивных типов (строки, числа, булевы значения).instanceofиспользуется для проверки, является ли объект экземпляром определённого класса или конструктора, что делает его более подходящим для работы с объектами и наследованием.
-
Проверка на
null:- При использовании
typeof nullвозвращается строка"object", что может быть источником путаницы. instanceofне может быть использован напрямую сnull, так какnullне является объектом.
- При использовании
Практические советы
- Используйте
typeofдля простых проверок типов, особенно для примитивов. - Используйте
instanceofдля проверки типов объектов, особенно при работе с классами и наследованием. - Не забывайте, что
typeofможет не всегда давать ожидаемые результаты для сложных объектов (например, массивы или функции).
Распространённые ошибки
- Ошибка в интерпретации результата
typeof nullкак объекта. - Неправильное использование
instanceofдля примитивных типов, таких какstring,number, иboolean, что может привести к неверным результатам. - Не учитывать прототипы при использовании
instanceof, что может привести к неожиданным результатам, если объект был создан с помощью другого конструктора.
Таким образом, правильное понимание и использование этих операторов поможет вам более эффективно работать с типами данных в JavaScript.