Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
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 такие проблемы просто не возникают