null, undefined y Nan son casos particulares de Javascript, que a veces hay cierta confusión, sobre todo entre null y undefined.
undefined
Tanto null como undefined van a representar un valor ausente, es decir, una variable que no tiene valor, la gran diferencia es que mientras undefined es una variable que no ha sido inicializada. Para que Javascript detecte que se trata de una variable indefinida, simplemente no asignamos ningún valor a dicha variable. undefined es una variable que no tiene valor, y que aparte no se le asignó ninguno a la hora a la que se creó.
Ejm
let indefinida; console.log(indefinida);
null
null es cuando creamos una variable y le asignamos intencionalmente el valor null, por lo tanto es un valor asignado por el programador, mientras que undefined es un valor asignado por Javascript cuando detecta que una variable no tiene valor.
Por lo tanto la gran diferencia entre null y undefined es que, ambos significan que la variable está vacía, pero undefined significa que no ha sido asignado ningún valor, y Javascript internamente le ha asignado el valor undefined, mientras que null, la variable está vacía pero intencionalmente el programador le ha asignado ese valor especial de null.
Nota: ambos valores significa que el valor está ausente, en undefined no se ha inicializado ningún valor, mientras que en null intencionalmente le hemos dado un valor null.
NaN
Cuando queremos realizar operaciones aritméticas entre diferentes tipos de datos que no son numéricos, NaN significa not a number, y la consola Javascript nos arrojará un NaN cuando asignemos o hagamos operaciones donde alguno de los datos en cuestión no sea un número.
Ejm
let noEsUnNumero = "Hola" * 3.7; console.log(noEsUnNumero); // IMPRIMIRÁ NaN