Tout d'abord, permettez-moi de souligner que NaN
c'est une valeur très spéciale: par définition, elle n'est pas égale à elle-même. Cela vient de la norme IEEE-754 sur laquelle s'appuient les numéros JavaScript. La valeur "pas un nombre" n'est jamais égale à elle-même, même lorsque les bits correspondent exactement. (Ce qu'ils ne sont pas nécessairement dans IEEE-754, cela permet plusieurs valeurs différentes "pas un nombre".) C'est pourquoi cela arrive même; toutes les autres valeurs en JavaScript sont égales à elles-mêmes, NaN
c'est juste spécial.
... est-ce que je manque une valeur dans JavaScript qui retournera true pour x! == x et false pour x! = x?
Non, tu ne l'es pas. La seule différence entre !==
et !=
est que ce dernier effectuera une coercition de type si nécessaire pour que les types des opérandes soient identiques. Dans x != x
, les types d'opérandes sont les mêmes, et donc exactement les mêmes que x !== x
.
Ceci est clair dès le début de la définition de l' opération abstraite d'égalité :
- ReturnIfAbrupt (x).
- ReturnIfAbrupt (y).
Si Type (x) est le même que Type (y), alors
Renvoie le résultat de la comparaison d'égalité stricte x === y.
...
Les deux premières étapes sont la plomberie de base. Donc, en fait, la toute première étape ==
est de voir si les types sont les mêmes et, si c'est le cas, de le faire à la ===
place. !=
et ne !==
sont que des versions niées de cela.
Donc, si Flanagan a raison, cela ne NaN
donnera vrai que pour x !== x
, nous pouvons être sûrs qu'il est également vrai que seul NaN
donnera vrai pour x != x
.
De nombreux programmeurs JavaScript utilisent par défaut ===
et !==
pour éviter certains pièges autour de la contrainte de type que font les opérateurs lâches, mais il n'y a rien à lire dans l'utilisation par Flanagan de l'opérateur strict vs lâche dans ce cas.
!==
chèques aux!=
chèques. Autant que je sache, il n'y a pas d'autre valeur oùx != x
. Mais il existe deux groupes distincts de développeurs JavaScript: ceux qui préfèrent!=
et ceux qui préfèrent!==
, que ce soit pour la vitesse, la clarté, l'expressivité, etc.