Primero, permítanme señalar que NaNes un valor muy especial: por definición, no es igual a sí mismo. Eso proviene del estándar IEEE-754 en el que se basan los números de JavaScript. El valor "no es un número" nunca es igual a sí mismo, incluso cuando los bits coinciden exactamente. (Que no son necesariamente en IEEE-754, permite múltiples valores diferentes "no un número"). Es por eso que incluso aparece; todos los demás valores en JavaScript son iguales a sí mismos, NaNes simplemente especial.
... ¿me falta algún valor en JavaScript que devuelva verdadero para x! == x y falso para x! = x?
No tu no eres. La única diferencia entre !==y !=es que este último hará una coerción de tipo si es necesario para que los tipos de operandos sean los mismos. En x != x, los tipos de los operandos son los mismos, por lo que es exactamente el mismo que x !== x.
Esto queda claro desde el comienzo de la definición de la Operación de igualdad abstracta :
- ReturnIfAbrupt (x).
- ReturnIfAbrupt (y).
Si Tipo (x) es lo mismo que Tipo (y), entonces
Devuelve el resultado de realizar una estricta comparación de igualdad x === y.
...
Los primeros dos pasos son fontanería básica. En efecto, el primer paso ==es ver si los tipos son los mismos y, si es así, hacer en su ===lugar. !=y !==son solo versiones negadas de eso.
Entonces, si Flanagan está en lo correcto, eso solo NaNdará verdad para x !== x, podemos estar seguros de que también es cierto que solo NaNdará verdad por x != x.
Muchos programadores de JavaScript usan de manera predeterminada ===y !==evitan algunas trampas en torno a la coerción de tipo que hacen los operadores sueltos, pero no hay nada que leer sobre el uso de Flanagan del operador estricto frente al operador suelto en este caso.
!==cheques sobre!=cheques. Que yo sepa, no hay otro valor dondex != x. Pero hay dos grupos distintos de desarrolladores de JavaScript: los que prefieren!=y los que prefieren!==, ya sea por velocidad, claridad, expresividad, etc.