← Назад к вопросам

Что будет в консоли при typeof null?

1.3 Junior🔥 162 комментариев
#JavaScript Core#TypeScript

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

При выполнении typeof null в консоли JavaScript будет выведена строка "object".

Подробное объяснение

Это один из самых известных и исторических "багов" или особенностей JavaScript, который сохраняется по сей день из соображений обратной совместимости. Хотя значение null представляет собой примитивный тип, предназначенный для обозначения преднамеренного отсутствия какого-либо объектного значения, оператор typeof возвращает для него не "null", а "null".

Историческая причина

Причина кроется в ранней реализации JavaScript (в браузере Netscape в 1995 году). На низком уровне значения в языке представлялись в виде 32-битных единиц, где первые 3 бита (type tag) указывали на тип значения. Распределение было следующим:

  • 000: объекты
  • 1: целые числа
  • 010: числа с плавающей точкой
  • 100: строки
  • 110: булевы значения

Значение null в большинстве систем представлялось как последовательность нулевых битов (0x00 в шестнадцатеричной системе). В результате, когда движок проверял тип null, он видел тип-тэг 000 и интерпретировал его как объект.

// Поведение, которое мы наблюдаем
console.log(typeof null); // "object"

// Для сравнения, поведение других примитивов:
console.log(typeof undefined); // "undefined"
console.log(typeof 42);        // "number"
console.log(typeof "Hello");   // "string"
console.log(typeof true);      // "boolean"
console.log(typeof Symbol());  // "symbol"
console.log(typeof 123n);      // "bigint"

Почему это не исправлено?

Несмотря на то, что эта ошибка признана (например, в спецификации ECMAScript она явно описана как унаследованная особенность), исправить её невозможно. Изменение результата typeof null сломало бы огромное количество существующего кода в интернете, который полагается на это поведение. Принцип "не ломай веб" является ключевым при развитии JavaScript и браузеров.

Практические следствия и как с этим работать

Поскольку null — это примитив, а не объект, с ним нельзя работать как с объектом (например, пытаться читать свойства). Попытка сделать это вызовет ошибку.

let value = null;
console.log(value.someProperty); // TypeError: Cannot read properties of null

Для точной проверки на null НЕЛЬЗЯ использовать typeof. Вместо этого следует использовать строгое равенство (===).

let value = null;

// НЕВЕРНО - даст ложный результат
if (typeof value === 'object') {
    console.log('Это объект или null!'); // Это выполнится, что неверно.
}

// ПРАВИЛЬНО - точная проверка
if (value === null) {
    console.log('Значение точно null.');
}

// Часто используется комбинированная проверка на null и undefined
if (value == null) { // Использует нестрогое равенство (==)
    console.log('Значение null или undefined.'); // Это выполнится.
    // Нестрогое равенство считает null == undefined (true).
}

Заключение

Таким образом, результатом typeof null является строка "object". Это не отражает логической сути типа, а является артефактом первоначальной реализации языка. Это поведение закреплено в стандарте ECMAScript и никогда не будет изменено. Каждому разработчику важно знать об этой особенности, чтобы:

  1. Не попасть в логическую ловушку при проверке типов.
  2. Понимать исторический контекст языка.
  3. Правильно выполнять проверки, используя оператор строгого равенства (=== null).