typeof null
Коротка відповідь
typeof null === "object"Результат: "object"
Чому так відбувається
Це - історична помилка в JavaScript, яка з'явилася ще в найпершій версії мови (1995 р.) і так і залишилася заради сумісності.
Історична причина
У ранніх версіях JS значення зберігалися у вигляді 32-бітних тегованих даних:
- перші 3 біти вказували на тип даних
- решта 29 біт - на саме значення
Для об'єктів використовувався типовий тег 000
(три нулі на початку 32-бітного значення).
А в null - усе значення складалося з нулів (0x00).
Тому під час перевірки typeof null рушій бачив:
«ага, перші три біти - 000 → це об'єкт».
Так і з'явилося:
typeof null // "object"Чому це не виправили
Тому що мільйони старих скриптів по всьому інтернету можуть залежати від цієї поведінки. Виправлення призвело б до масових поломок.
Тому специфікація ECMAScript залишила це як «відому помилку», але офіційно задокументувала її.
Як правильно перевіряти null
Через цей баг не можна використовувати лише typeof для перевірки на null.
Неправильно:
if (typeof value === 'object') {
// може бути null!
}Правильно:
if (value === null) {
console.log('Це null');
}або якщо хочеш відрізнити null від інших об'єктів:
if (typeof value === 'object' && value !== null) {
console.log("Це об'єкт, але не null");
}Приклад для наочності
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 === null | true | Саме значення дорівнює собі |
typeof undefined | "undefined" | Очікувана поведінка |
typeof {} | "object" | Справжній об'єкт |
typeof [] | "object" | Масив - підтип об'єкта |
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.