Смысл
undefined — значение нет: переменная объявлена без init, нет свойства, функция без return, пропущенный аргумент.
null — явное «пусто» от программиста/API.
let a;
a;
JSON.parse('{"x":null}').x;
typeof null;
typeof undefined;
Сравнение
null == undefined → true; null === undefined → false. Для проверок «есть значение» часто value == null ловит оба.
Практика
В API договоритесь: null = «поле сознательно пустое», отсутствие ключа / undefined = «не передавали» (и JSON.stringify опускает undefined).