Коротка відповідь
juniortypeof null — це оператор, що повертає тип значення. У JavaScript історично реалізовано так, що null зберігається як об’єкт‑значення, тому typeof null → 'object'. Це залишено для сумісності з ранніми версіями мови.
Повне пояснення
Що це і навіщо
typeof – оператор, що повертає рядкове представлення типу операнда. Він потрібен для раннього визначення типу даних, наприклад при валідації або логічних умовах.
Ключові принципи/терміни
null– спеціальне значення, що означає «порожнє» або «відсутність об’єкта».object– тип, що описує будь‑який посилальний об’єкт.- Historical quirk – у ранніх версіях JavaScript тип
nullбув реалізований як об’єкт, що призвело до несподіваного результату.
Як це працює
- При виконанні
typeof nullJavaScript перевіряє внутрішній тип значення. - Для
nullвстановлено флаг, що вказує на тип object. - Оператор повертає рядок
'object'незалежно від того, щоnullне є об’єктом.
Практика і реалізація
console.log(typeof null); // 'object'
У TypeScript це не змінює поведінку, але тип null визначається як null.
Тестування
import { expect } from 'vitest';
expect(typeof null).toBe('object');
Особливості в контексті JS Core
- Це одна з найвідоміших «помилок» мови, що часто використовується як приклад для обговорення історії JavaScript.
- Для перевірки на
nullслід використовувати строгий порівняння:value === null.
Оптимізація, типові помилки та edge cases
- Помилка:
if (typeof value === 'object')може помилково сприйматиnullяк об’єкт. - Рішення: додати перевірку
value !== nullабо використовуватиObject.prototype.toString.call(value) === '[object Null]'.
Диагностика і отладка
- Симптом:
typeof valueповертає'object', хоча очікується, що цеnull. - Причина: використання
typeofдля перевірки наnull. - Дія: замінити на
value === nullабоObject.is(value, null).
Альтернативи
value === null– пряме порівняння.Object.is(value, null)– враховує специфічні випадки (NaN, -0).
Крайні випадки і часті помилки
typeof undefined→'undefined'(правильно).typeof NaN→'number'(необхідно перевіряти черезNumber.isNaN).typeof []→'object'(масив – об’єкт).typeof new Date()→'object'(об’єкт‑дата).typeof function(){}→'function'(особливий тип об’єкта).typeof Symbol()→'symbol'.typeof BigInt(10)→'bigint'.Object.prototype.toString.call(null)→'[object Null]'(точний тип).
Cheatsheet + follow‑up питання
typeof null→'object'(historical quirk).- Для перевірки на
null:value === nullабоObject.is(value, null). - Чому інші типи повертають правильні рядки? Тому що їх внутрішній флаг встановлено коректно.
Follow‑up питання: Як можна перевірити, чи є значення об’єктом, але не null?