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

Ответ

В JavaScript null и undefined представляют разные концепции отсутствия значения.

Критерий undefined null
Тип typeof undefined === 'undefined' typeof null === 'object' (историческая особенность языка)
Значение по умолчанию Значение неинициализированных переменных, отсутствующих свойств объекта, параметров функции, которым не передали аргумент. Явно присваиваемое значение, обозначающее "ничего", "пусто", "значение отсутствует".
Использование Системное (движок JS). Программное (разработчик).

Примеры:

// undefined (системное)
let a;
console.log(a); // undefined
const obj = {};
console.log(obj.nonExistentProp); // undefined
function foo(x) { console.log(x); }
foo(); // undefined

// null (программное)
let b = null; // Явно указываем, что значения нет
const response = await fetch('/api/data');
const data = await response.json();
if (data.error) {
  data.result = null; // Явно обнуляем результат при ошибке
}

Проверка:

// Строгая проверка (рекомендуется)
if (value === undefined) { /* только для undefined */ }
if (value === null) { /* только для null */ }

// Проверка на "nullish" (null или undefined) - ES2020
if (value == null) { /* true для null И undefined (но осторожно с ==) */ }
if (value === null || value === undefined) { /* явная и безопасная проверка */ }
const result = value ?? 'default'; // Оператор нулевого слияния (Nullish Coalescing)

Ключевое: undefined обычно означает, что значение ещё не было определено, в то время как null — это намеренное указание на отсутствие какого-либо объектного значения.

Ответ 18+ 🔞

А, ну это классика, блядь! Смотри, тут про null и undefined — вечная тема для споров, как спор про ананас в пицце.

Представь, ты заходишь в свою квартиру. Если переменная — это комната, то undefined — это когда ты ещё даже не зашёл и нихуя не знаешь, что там внутри. Может, там мебель, а может, голые стены. А null — это когда ты специально зашёл и вынес оттуда всё до чиста, оставил голый пол. Намеренно сделал пустоту, ёпта.

Вот таблица, чтобы не ебать мозг:

Критерий undefined null
Тип typeof undefined === 'undefined' (логично, да?) typeof null === 'object' (а вот это пиздец, исторический косяк языка, смирись)
Значение по умолчанию Что-то неинициализированное: переменная без значения, свойство, которого нет, аргумент, который не передали. Сам язык это подсовывает. Ты сам, своей рукой, пишешь = null. Типа "здесь пусто, я так захотел".
Использование Системное, от движка. Твоё, осознанное, программное.

Примеры, чтобы вообще всё встало на свои места:

// undefined (тебе его подарили)
let a; // Объявил, но не дал значения — получай undefined, логично же?
console.log(a); // undefined
const obj = {};
console(obj.nonExistentProp); // undefined — свойства-то нет, чего ты ждёшь?
function foo(x) { console.log(x); }
foo(); // undefined — аргумент не передали, чему 'x' равняться?

// null (ты это сделал сам)
let b = null; // Явно говорю: "b, ты сейчас ничего не значишь, пустота".
const response = await fetch('/api/data');
const data = await response.json();
if (data.error) {
  data.result = null; // Явно обнуляю результат, потому что запрос пошёл по пизде.
}

А теперь самое важное — как это проверять, чтобы не облажаться:

// Делай строго (все адекватные люди так делают)
if (value === undefined) { /* ловим только undefined */ }
if (value === null) { /* ловим только null */ }

// Проверка на "null или undefined" (nullish)
if (value == null) { /* сработает и на null, и на undefined, но осторожно с этим '==' */ }
// Лучше уж явно, без этих танцев:
if (value === null || value === undefined) { /* вот так надёжно, ебать */ }
const result = value ?? 'default'; // Оператор нулевого слияния — красота! Вернёт 'default' только если value — null или undefined.

Короче, суть: undefined — это "ещё не определено", движок тебе его подкидывает. null — это "определённо ничего", ты сам это пишешь. Главное — не путай их, а то будет тебе хиросима в коде, ядрёна вошь!

Видео-ответы