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

Что выведет typeof(null)?

1.0 Junior🔥 251 комментариев
#JavaScript Core

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

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

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

typeof(null) выводит "object"

Ответ: typeof(null) вернёт строку "object".

console.log(typeof null); // "object"

Это один из самых известных "багов" в JavaScript и часто спрашивается на собеседованиях!

Почему это происходит?

В JavaScript версии ES1 (самая первая версия) значения хранились вместе с информацией об их типе. Каждый тип кодировался 1-3 байтами в начале значения:

Тип        | Код
-----------+-----------
object     | 000
null       | 0000 0000 (NULL_TAG)
undefined  | -2147483648

Все объекты начинались с бит-кода 000, включая null. Когда создавали оператор typeof, он проверял эти первые биты, и для null тоже была найдена последовательность 000 - отсюда и "object".

После этого ошибка стала частью спецификации и её не изменили, чтобы не сломать существующий код. Это называется историческим багом.

Как проверить, что значение действительно null?

Нельзя полагаться на typeof. Вот правильные способы:

// Способ 1: Прямое сравнение (ЛУЧШИЙ СПОСОБ)
const value = null;
if (value === null) {
  console.log("Это null");
}

// Способ 2: Используя Object.prototype.toString
Object.prototype.toString.call(null); // "[object Null]"

// Способ 3: Проверка через typeof и сравнение
if (typeof value === "object" && value === null) {
  console.log("Это null");
}

Похожие сюрпризы с typeof

// Array - это тоже объект
console.log(typeof []); // "object", а не "array"

// Function - это отдельный тип
console.log(typeof function() {}); // "function"

// NaN - это число
console.log(typeof NaN); // "number" (парадокс!)

// undefined
console.log(typeof undefined); // "undefined"

// Строка
console.log(typeof "hello"); // "string"

// Число
console.log(typeof 42); // "number"

// Boolean
console.log(typeof true); // "boolean"

// Symbol
console.log(typeof Symbol("id")); // "symbol"

// BigInt
console.log(typeof 100n); // "bigint"

Практическая проверка типов

Для надёжной проверки типов в modern JavaScript используй эти подходы:

// Проверка на null
const isNull = (value) => value === null;

// Проверка на undefined
const isUndefined = (value) => value === undefined;

// Проверка на null или undefined
const isNullish = (value) => value == null; // == используется намеренно

// Проверка на массив
const isArray = Array.isArray(value);

// Проверка на объект (но не null, не array)
const isPlainObject = (value) => 
  typeof value === "object" && 
  value !== null && 
  !Array.isArray(value);

// Проверка на функцию
const isFunction = (value) => typeof value === "function";

TypeScript спасает от таких ошибок

Если бы ты использовал TypeScript с strict: true, то многие проблемы с типами были бы поймены на этапе разработки:

const value: unknown = null;

// TypeScript потребует явную проверку
if (value === null) {
  console.log("Это null");
} else if (value === undefined) {
  console.log("Это undefined");
}

// Без проверки TypeScript выдаст ошибку
console.log(value.toString()); // ERROR: Object is possibly null

Итоги

  • typeof null возвращает "object" - это историческое наследие JavaScript
  • Для проверки null используй прямое сравнение value === null
  • typeof полезен только для примитивных типов (string, number, boolean)
  • Для сложных типов используй Array.isArray(), instanceof или явные проверки
  • В TypeScript с strict mode такие проблемы просто не возникают