В чем разница между null и undefined


В JavaScript null и undefined — это два примитивных типа, которые представляют "отсутствие значения", но делают это по-разному. Несмотря на схожесть, между ними есть важные различия в семантике, использовании, поведении при сравнении, преобразовании типов и областях применения.

🔹 Что такое undefined

undefined — это значение, которое автоматически присваивается переменной, если:

  1. переменная была объявлена, но не инициализирована;

  2. у объекта запрашивается несуществующее свойство;

  3. функция не возвращает значение явно (return не указан);

  4. параметр функции не был передан при вызове;

  5. используется оператор 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}'

🔸 Ошибки и подводные камни

  1. Приведение типов может привести к неожиданным результатам:
null + 1 // 1
undefined + 1 // NaN
  1. typeof null === "object" — это исторический баг.

  2. 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, условной логике и сериализации.