Глиф Учебники

Чем undefined отличается от null

Справочник · JavaScript · 1 минута чтения

JavaScript
let a;
const user = { name: "Аня" };
function f() {}

console.log(a);
console.log(user.age);
console.log(f());
console.log(typeof undefined, typeof null);
console.log(null == undefined, null === undefined);
Вывод
undefined
undefined
undefined
undefined object
true false

typeof null выдаёт "object" — это старая ошибка языка, оставленная ради совместимости. На деле null — отдельный тип, не объект.

Как проверить

Что нужноПроверка
именно undefinedx === undefined
именно nullx === null
null или undefinedx == null или x === null || x === undefined
любое «пустое» значение!x — но сюда попадут и 0, "", false

Запись x == null — единственное место, где нестрогое == пишут нарочно: null нестрого равен только undefined и себе. Если в проекте принято писать только ===, используйте длинный вариант.

Для значения по умолчанию есть оператор ??: name ?? "Гость" даёт "Гость" и при null, и при undefined, но оставляет 0 и пустую строку. Безопасно обратиться к свойству того, что может быть null, — user?.name.

Где разница видна

Параметры по умолчанию срабатывают только на undefined:

JavaScript
function greet(name = "гость") {
  return "Привет, " + name;
}

console.log(greet());
console.log(greet(undefined));
console.log(greet(null));
Вывод
Привет, гость
Привет, гость
Привет, null

JSON не знает undefined: такие свойства JSON.stringify просто пропускает, а null сохраняет:

JavaScript
console.log(JSON.stringify({ a: undefined, b: null }));
Вывод
{"b":null}

Арифметика: null превращается в 0, undefined — в NaN. Поэтому null + 1 даёт 1, а undefined + 1 — NaN.

Что писать в своём коде

Чтобы явно сказать «здесь пусто», присваивайте null, а undefined оставьте языку. Тогда при отладке сразу видно: null — значение поставили нарочно, undefined — его не задали, возможно, по ошибке.

Ошибка Cannot read properties of undefined (или of null) значит, что свойство читают у пустого значения. Как её найти — в справке Ошибка Cannot read properties of null.