← Назад к вопросам

В чём разница между null и undefined в JavaScript?

1.3 Junior🔥 161 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Разница между null и undefined в JavaScript

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

Семантическое значение

undefined означает, что переменная была объявлена, но не инициализирована. Это значение по умолчанию для:

  • Неинициализированных переменных
  • Несуществующих свойств объектов
  • Параметров функций, которым не передали аргументы
  • Возвращаемого значения функций без return
let uninitializedVar;
console.log(uninitializedVar); // undefined

const obj = {};
console.log(obj.nonExistentProp); // undefined

function test(a) {
  console.log(a); // undefined, если вызвать test()
}

null — это явное указание на отсутствие значения, намеренно установленное разработчиком. Это значение-заполнитель, которое говорит: "здесь ничего нет, и я это специально обозначил".

const emptyValue = null; // Явно указываем, что значения нет
const response = api.getData(); // Может вернуть null, если данных нет

Типы данных

Оба значения имеют свои собственные типы:

  • typeof undefined возвращает "undefined"
  • typeof null возвращает "object" (историческая особенность JavaScript)
console.log(typeof undefined); // "undefined"
console.log(typeof null);      // "object" (но это не объект!)

Поведение при сравнении

Нестрогое сравнение (==)

При нестрогом сравнении null и undefined считаются равными:

console.log(null == undefined);  // true
console.log(null == null);       // true
console.log(undefined == undefined); // true

Строгое сравнение (===)

При строгом сравнении они НЕ равны, так как имеют разные типы:

console.log(null === undefined); // false
console.log(null === null);      // true
console.log(undefined === undefined); // true

Практическое использование

Когда использовать undefined:

  • Системное значение: JavaScript сам присваивает undefined
  • Удаление свойств: при удалении свойства объекта (delete obj.prop)
  • Пропущенные параметры функций

Когда использовать null:

  • Явное обнуление: когда нужно явно указать на отсутствие значения
  • Сброс значений: очистка переменных или свойств объектов
  • Работа с DOM: многие DOM-методы возвращают null при отсутствии элементов
  • API и библиотеки: часто используют null для обозначения "нет данных"
// Пример использования null для сброса значения
let userData = fetchUserData();
// ... позже
userData = null; // Явно освобождаем память и указываем на отсутствие данных

// Пример с DOM
const element = document.getElementById('non-existent');
console.log(element); // null

Преобразование в другие типы

При преобразовании в числа и булевы значения:

// Преобразование в числа
console.log(Number(undefined)); // NaN
console.log(Number(null));      // 0

// Преобразование в булевы значения
console.log(Boolean(undefined)); // false
console.log(Boolean(null));      // false

// Преобразование в строки
console.log(String(undefined)); // "undefined"
console.log(String(null));      // "null"

Особенности работы в различных контекстах

В JSON:

  • undefined игнорируется при сериализации
  • null сохраняется как есть
const data = { a: undefined, b: null, c: 42 };
console.log(JSON.stringify(data)); // '{"b":null,"c":42}'

В арифметических операциях:

console.log(undefined + 10); // NaN
console.log(null + 10);      // 10 (null преобразуется в 0)

Рекомендации по использованию

  1. Используйте undefined для значений, которые система должна обрабатывать автоматически
  2. Используйте null когда вам нужно явно указать на намеренное отсутствие значения
  3. Проверяйте оба случая при валидации входных данных:
function validateValue(value) {
  if (value === undefined || value === null) {
    return 'Значение отсутствует';
  }
  return value;
}

// Или используя современный синтаксис
const safeValue = inputValue ?? 'default';

Историческая справка

Особенность typeof null === "object" является багом в языке, который сохраняется для обратной совместимости. В первоначальной реализации JavaScript значения были представлены как 32-битные единицы, где первые 3 бита указывали тип. Для null использовалось представление 000, которое совпадало с представлением объектов.

Заключение

Понимание разницы между null и undefined критически важно для:

  • Отладки кода: неправильное обращение с этими значениями — частая причина ошибок
  • Оптимизации производительности: правильное использование помогает движку JavaScript лучше оптимизировать код
  • Читаемости кода: явное использование null делает намерения разработчика понятнее
  • Работы с API: многие внешние API четко различают эти значения

В современном JavaScript рекомендуется использовать строгое сравнение (===) для избежания неявных преобразований и четко определять, когда использовать каждое из этих значений в вашей кодовой базе.

В чём разница между null и undefined в JavaScript? | PrepBro