Чем undefined отличается от null
undefined— «значение не задано». Его даёт сам язык: переменная без значения, несуществующее свойство, функция безreturn, параметр, который не передали.null— «пусто», и это пусто записал программист: «пользователь не выбран», «ответа ещё нет».
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 falsetypeof null выдаёт "object" — это старая ошибка языка, оставленная ради совместимости. На деле null — отдельный тип, не объект.
Как проверить
| Что нужно | Проверка |
|---|---|
именно undefined | x === undefined |
именно null | x === null |
null или undefined | x == null или x === null || x === undefined |
| любое «пустое» значение | !x — но сюда попадут и 0, "", false |
Запись x == null — единственное место, где нестрогое == пишут нарочно: null нестрого равен только undefined и себе. Если в проекте принято писать только ===, используйте длинный вариант.
Для значения по умолчанию есть оператор ??: name ?? "Гость" даёт "Гость" и при null, и при undefined, но оставляет 0 и пустую строку. Безопасно обратиться к свойству того, что может быть null, — user?.name.
Где разница видна
Параметры по умолчанию срабатывают только на undefined:
function greet(name = "гость") {
return "Привет, " + name;
}
console.log(greet());
console.log(greet(undefined));
console.log(greet(null));Привет, гость
Привет, гость
Привет, nullJSON не знает undefined: такие свойства JSON.stringify просто пропускает, а null сохраняет:
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.