Для начала давайте поговорим о том, что у них общего.
Во-первых, они принадлежат к 7 «примитивам» (примитивным типам) JS:
let primitiveTypes = ['string', 'number', 'null', 'undefined', 'boolean', 'symbol', 'bigint']
Во-вторых, они являются ложными значениями, т.е. результатом их преобразования в логическое значение с помощью Boolean() или оператора "!!" является false:
undefined («неопределенный») представляет собой значение по умолчанию: • переменной, которой не было присвоено значения, т.е. объявленной, но не инициализированной переменной; • функции, которая ничего не возвращает явно, например, console.log(1); • несуществующего свойства объекта.
null — это «значение отсутствия значения». null — это значение, которое присваивается переменной явно.
При сравнении null и undefined мы получаем true, когда используем оператор "==", и false при использовании оператора "===".