Что такое typeof и instanceof в JavaScript?
typeof — унарный оператор, возвращающий строку с именем типа значения; instanceof — бинарный оператор, проверяющий, есть ли прототип конструктора в цепочке прототипов объекта.typeof
typeof — унарный оператор, который возвращает строку, описывающую тип операнда. Он вычисляется до выполнения выражения и никогда не выбрасывает исключение.
Возможные возвращаемые значения:
"undefined"— дляundefined"boolean"— для булевых значений"number"— для чисел (включаяNaNиInfinity)"bigint"— для значений типа BigInt"string"— для строк"symbol"— для символов"function"— для функций (объектов с методом[[Call]])"object"— для объектов иnull(исторический баг)
Главная ловушка: typeof null === "object" — это давняя ошибка в спецификации, оставленная из соображений обратной совместимости. Массивы тоже возвращают "object", поэтому typeof не позволяет отличить массив от обычного объекта.
instanceof
instanceof — бинарный оператор, который проверяет, находится ли prototype конструктора в цепочке прототипов объекта.
Синтаксис: объект instanceof Конструктор
Оператор последовательно проходит по прототипной цепочке объекта и ищет совпадение с Конструктор.prototype. Если совпадение найдено — возвращает true, иначе — false.
Ограничения instanceof:
- Не работает с примитивами — всегда возвращает
false - Может давать неожиданные результаты при работе с разными realm (например, в iframe, где существуют разные глобальные объекты
Array)
Когда что использовать
typeof подходит для проверки примитивных типов: string, number, boolean, undefined, symbol, bigint, а также для определения функций.
instanceof подходит для проверки принадлежности к конкретному классу или конструктору при работе с объектами.
Для проверки null используется строгое равенство === null, поскольку ни один из операторов не даёт подходящего результата напрямую.
Современная альтернатива
Object.prototype.toString.call(value) возвращает более точный результат для встроенных типов и не имеет проблемы с null:
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(/re/) // "[object RegExp]"
Что хочет услышать интервьюер
Кандидат перечисляет все возможные строковые значения typeof и понимает, что результат — всегда строка
Знает об историческом баге: typeof null === "object", и не использует typeof для проверки на null
Понимает, что instanceof проверяет прототипную цепочку, а не тип напрямую
Знает, что instanceof не работает с примитивами и возвращает false для них
Умеет выбрать подходящий инструмент: typeof для примитивов, instanceof для объектов и классов
Пример: typeof — проверка примитивных типов
// Основные случаи
console.log(typeof 42) // "number"
console.log(typeof "hello") // "string"
console.log(typeof true) // "boolean"
console.log(typeof undefined) // "undefined"
console.log(typeof Symbol()) // "symbol"
console.log(typeof 42n) // "bigint"
console.log(typeof function(){}) // "function"
// Ловушки
console.log(typeof null) // "object" — исторический баг!
console.log(typeof []) // "object" — массив тоже объект
console.log(typeof {}) // "object"
// Правильная проверка на null
const value = null
console.log(value === null) // true — единственный надёжный способ
Пример: instanceof — проверка принадлежности классу
class Animal {
name: string
constructor(name: string) {
this.name = name
}
}
class Dog extends Animal {}
const dog = new Dog("Sharik")
// Проверка по цепочке прототипов
console.log(dog instanceof Dog) // true
console.log(dog instanceof Animal) // true — Dog наследует Animal
console.log(dog instanceof Object) // true — все объекты наследуют Object
// С массивами
const arr = [1, 2, 3]
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true
// Примитивы — всегда false
console.log(42 instanceof Number) // false — примитив, не объект-обёртка
// Более надёжная проверка встроенных типов через toString
console.log(Object.prototype.toString.call(arr)) // "[object Array]"
console.log(Object.prototype.toString.call(null)) // "[object Null]"
Типичные ошибки
Используют typeof для проверки на null, не зная, что typeof null === "object"
Думают, что instanceof работает с примитивами (например, 42 instanceof Number — false)
Путают: typeof всегда возвращает строку, а не булево значение — нужно сравнивать с ===
Пытаются различить массив и объект через typeof — оба вернут "object"
Не знают о проблеме разных realm: массив из iframe не проходит проверку instanceof Array в родительском окне


