Skip to main content

typeof null

Коротка відповідь

javascript
typeof null === "object"

Результат: "object"


Чому так відбувається

Це - історична помилка в JavaScript, яка з'явилася ще в найпершій версії мови (1995 р.) і так і залишилася заради сумісності.


Історична причина

У ранніх версіях JS значення зберігалися у вигляді 32-бітних тегованих даних:

  • перші 3 біти вказували на тип даних
  • решта 29 біт - на саме значення

Для об'єктів використовувався типовий тег 000 (три нулі на початку 32-бітного значення).

А в null - усе значення складалося з нулів (0x00).

Тому під час перевірки typeof null рушій бачив: «ага, перші три біти - 000 → це об'єкт».

Так і з'явилося:

javascript
typeof null // "object"

Чому це не виправили

Тому що мільйони старих скриптів по всьому інтернету можуть залежати від цієї поведінки. Виправлення призвело б до масових поломок.

Тому специфікація ECMAScript залишила це як «відому помилку», але офіційно задокументувала її.


Як правильно перевіряти null

Через цей баг не можна використовувати лише typeof для перевірки на null.

Неправильно:

javascript
if (typeof value === 'object') { // може бути null! }

Правильно:

javascript
if (value === null) { console.log('Це null'); }

або якщо хочеш відрізнити null від інших об'єктів:

javascript
if (typeof value === 'object' && value !== null) { console.log("Це об'єкт, але не null"); }

Приклад для наочності

javascript
console.log(typeof null); // "object" console.log(typeof {}); // "object" console.log(typeof []); // "object" console.log(null === {}); // false console.log(null === undefined); // false

Усі три (null, {}, []) повертають "object", але це різні типи даних.


Підсумок

ПеревіркаРезультатПояснення
typeof null"object"Історична помилка в реалізації
null === nulltrueСаме значення дорівнює собі
typeof undefined"undefined"Очікувана поведінка
typeof {}"object"Справжній об'єкт
typeof []"object"Масив - підтип об'єкта

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.