Что такое typeof и instanceof в JavaScript?

JuniorJavaScript · Frontend·Обновлено 29 июля 2026
Коротко
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 в родительском окне

Лучшие курсы по теме

изображение курса

TypeScript с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.8
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Feature-Sliced Design

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.6
3 999 ₽ 6 990 ₽
Подробнее
изображение курса

Next.js - с нуля

Антон Ларичев
AI-тренажерыAI-тренажеры
Практика в студииПрактика в студии
Гарантия
Бонусы
иконка звёздочки рейтинга4.7
3 999 ₽ 6 990 ₽
Подробнее