Primero, permítanme señalar que NaN
es 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, NaN
es 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 NaN
dará verdad para x !== x
, podemos estar seguros de que también es cierto que solo NaN
dará 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.