В чем разница между null и undefined
В JavaScript null и undefined — это два примитивных типа, которые представляют "отсутствие значения", но делают это по-разному. Несмотря на схожесть, между ними есть важные различия в семантике, использовании, поведении при сравнении, преобразовании типов и областях применения.
🔹 Что такое undefined
undefined — это значение, которое автоматически присваивается переменной, если:
-
переменная была объявлена, но не инициализирована;
-
у объекта запрашивается несуществующее свойство;
-
функция не возвращает значение явно (return не указан);
-
параметр функции не был передан при вызове;
-
используется оператор void, возвращающий undefined.
Примеры:
let a;
console.log(a); // undefined
let obj = {};
console.log(obj.prop); // undefined
function test() {}
console.log(test()); // undefined
function greet(name) {
console.log(name); // undefined, если не передать аргумент
}
greet();
Тип:
typeof undefined; // "undefined"
🔹 Что такое null
null — это преднамеренное отсутствие значения. Разработчик явно присваивает null, чтобы указать: "Здесь ничего нет", "Это значение неизвестно", "Очистить переменную", "Пустая ссылка" и т.п.
Примеры:
let a = null; // Явно задано "нет значения"
let obj = { user: null }; // Поле намеренно пустое
Тип:
typeof null; // "object"
Это историческая ошибка в языке JavaScript. По спецификации null — примитив, но typeof null возвращает "object" — это баг в языке с 1995 года, сохранённый для совместимости.
🔸 Ключевые различия по смыслу
Характеристика | undefined | null |
---|---|---|
Кто назначает | JavaScript автоматически | Разработчик вручную |
--- | --- | --- |
Семантика | Значение отсутствует по умолчанию | Намеренно установлено как "пустое" |
--- | --- | --- |
Использование | Неинициализированные переменные, параметры | Явное "отсутствие значения" или "пусто" |
--- | --- | --- |
Тип | undefined | object (по typeof) |
--- | --- | --- |
🔸 Сравнение null и undefined
Не строгое сравнение (==):
null == undefined; // true
Они считаются равными только при нестрогом сравнении — это исключение из правил приведения типов.
Строгое сравнение (===):
null === undefined; // false
Типы различны, поэтому строгое сравнение возвращает false.
🔸 Преобразование типов
- В логическом контексте (Boolean() или if) оба значения приводятся к false:
Boolean(null); // false
Boolean(undefined); // false
- При численном преобразовании:
Number(null); // 0
Number(undefined); // NaN
- При строковом:
String(null); // "null"
String(undefined); // "undefined"
🔸 Использование в JSON
- undefined игнорируется при сериализации JSON.stringify:
JSON.stringify({ a: undefined }); // "{}"
- null сохраняется:
JSON.stringify({ a: null }); // '{"a":null}'
🔸 Ошибки и подводные камни
- Приведение типов может привести к неожиданным результатам:
null + 1 // 1
undefined + 1 // NaN
-
typeof null === "object" — это исторический баг.
-
undefined можно переопределить в старом JS (до ES5):
undefined = "oops";
console.log(undefined); // "oops" — опасно!
Современные окружения защищены, но undefined теперь считается необъявляемым.
🔸 Когда использовать null, а когда undefined
✅ Используйте null, когда:
-
вы хотите намеренно указать, что значения нет;
-
нужно очистить ссылку на объект;
-
поле должно быть "пустым" в JSON, например для API;
-
структура объекта должна оставаться, но содержать "ничего".
let user = { name: null }; // Явно нет имени
✅ Используйте undefined, когда:
-
переменная не была инициализирована;
-
аргумент функции не был передан;
-
свойство объекта не определено;
-
вы пишете функцию, которая иногда ничего не возвращает.
function findUser(id) {
if (!db.has(id)) return undefined;
return db.get(id);
}
🔸 Сравнение в таблице
Поведение | undefined | null |
---|---|---|
Присваивается автоматически | ✅ | ❌ |
--- | --- | --- |
Присваивается явно | ❌ | ✅ |
--- | --- | --- |
Тип (typeof) | "undefined" | "object" (баг) |
--- | --- | --- |
Преобразование в число | NaN | 0 |
--- | --- | --- |
Преобразование в логический тип | false | false |
--- | --- | --- |
Преобразование в строку | "undefined" | "null" |
--- | --- | --- |
Сериализация JSON | Пропускается | Сохраняется |
--- | --- | --- |
Строгое сравнение (===) | undefined === undefined → true | null === null → true |
--- | --- | --- |
Равны друг другу по == | true | true |
--- | --- | --- |
Таким образом, undefined — это сигнал от самого языка о том, что значения нет, а null — это ваш собственный сигнал о том, что значения быть не должно. Их различие важно понимать для правильной архитектуры кода, особенно при валидации данных, работе с API, условной логике и сериализации.