Null e Undefined não sao tipos de dados. Correspondem a representações de valores. Cada linguagem lida com isso de alguma forma.
No js Null e Undefined foram denominados e "implementados" como tipos da linguagem para que seja possível realizar a coerção entre tipos de forma natural (https://developer.mozilla.org/en-US/docs/Glossary/Type_coercion) as operações de comparação não estrita (o ==) é uma mágica polemica no js, amada por poucos e odiada por muitos... Essa é uma discussão ampla e envolve aspectos profundos...
Outro ponto importante sobre o undefined é que foi feito como uma "arte manha" da linguagem para que seu código errado (com o tempo vc perceberá) não gere um erro em execução! Na época inicial da linguagem foi interessante pois era o que chamavam de (parâmetro opcional), e acesso seguro a varáveis sem valores. Hj em dia usar undefined para representar alguns conceitos é um crime!
O typescript está sendo e será o futuro do js, tipagem correta e 'forte' oferece segurança em tempo de edição/compilação.
Programei anos em js puro e a pior coisa são erros escondidos por comparações erradas e falta de checagem de tipos antes de usar um dado.
A dica é:
- Nunca use undefined. mas sempre teste qud necessário. Ele existe para representar um "endereço de mémoria" inacessível. Ou seja, a linguagem em muitas situações, ao invés de dá um erro de "acesso" ela vai lhe retornar undefined. Ex: argumento de função que não foi preenchido, ou acesso a uma propriedade inexistente via indíce (objeto["xxx"]), ou variável declarada sem valor atribuído;
- O null deve ser utilizado para representar uma referência "vazia". Ou seja a "área de memória" existe mas está vazia sem valor "semântico" definido o valor presente é o "null";
- Para garantir que o garbage colector trabalhe corretamente e limpe a memória evite referências cíclicas;
Realmente é complicado entender de primeira a real desses "tipos", com o tempo vc vai sentindo na pele o armengue geral do js... Neste caso mesmo o null é uma keyword da linguagem e o undefined é uma prioridade global (uma variável global)...