Quelle est la différence entre (NaN != NaN) et (NaN !== NaN)?
Tout d'abord, je tiens à mentionner que je sais comment isNaN()
et Number.isNaN()
travail. Je suis de lecture Le Précise le Guide de par David Flanagan et il donne un exemple de la façon de vérifier si la valeur est NaN
:
x !== x
Ce résultat true
si et seulement si x
est NaN
.
Mais maintenant j'ai une question: pourquoi utilise-t-il une comparaison stricte? Parce qu'il semble que
x != x
se comporte de la même manière. Est-il sécuritaire d'utiliser les deux versions, ou il me manque une certaine valeur(s) dans le JavaScript qui sera de retour true
pour x !== x
et false
pour x != x
?
- À mon avis , une comparaison stricte (===) est plus précis que les autres. parce qu'il compare non seulement la valeur, mais aussi le type de données de cet objet.
- ok, mais le type de
NaN is number
et il n'est pas nécessaire pour une comparaison stricte? C'est comme dans ce cas c'est juste une question de style, je pense. - selon votre entrée x==y est également faux
- Il se pourrait que Flanagan qu'on préfère
!==
contrôles de plus de!=
contrôles. Autant que je sache, il n'y a pas d'autre valeur oùx != x
. Mais il y a deux groupes distincts les développeurs JavaScript: ceux qui préfèrent!=
et ceux qui préfèrent!==
, que ce soit pour la vitesse, la précision, l'expressivité, etc. - Pour vérifier ce qui est de la comparaison de deux valus à partir du même type
==
ou!=
doit toujours retourner le même résultat que===
et!==
. Les problèmes apparaissent lorsque l'on compare les différents types. - Pourquoi utiliser lâche la comparaison lors de la comparaison stricte se comporte de la même manière?
- NaN est l'unique type d'objet qui n'est pas égale à elle-même.
NaN
n'est pas un type unique, c'est un nombre. C'est une valeur unique qui n'est pas égal à lui-même.- Le titre semble être tromper les gens. Je vous suggère de le changer pour quelque chose comme "Est x != x toujours différent de x !== x?"
==
et===
sont pas juste le style de préférence. Ils servent à des fins différentes pour ceux qui comprennent comment ils fonctionnent. Ilsne pas se comportent de la même, mais ont parfois les mêmes résultats. Ma réponse a donné plusieurs exemples de cas où elles sont différentes. David Flanagan est aussi mauvais pour l'aide soit==
ou===
pour NaN comparaison de toute façon. NaN est une valeur unique qui n'est pas égal à quoi que ce soit-y compris lui-même--de sorte que même lorsquex
est NaN,x == NaN
etx === NaN
sera toujours faux. C'est pourquoi la négation semble se comporter de la même, il est toujours faux, sauf si vous utilisezisNaN()
.- Giorgi a dit "dans ce cas," c'est une affaire de style. Et il a raison. Il n'est pas le style quand les types des opérandes sont différents, mais il est de style quand ils sont les mêmes. Séparément: Flanagan est de faire ces comparaisons avec
===
avec NaN pour faire le point que NaN n'est pas égal à lui-même. Il n'est pas "mal", qu'il fait ça comme une tâche d'enseignement, ce qui démontre que ça ne fonctionne pas. - Je viens de tomber sur cet article après la lecture de votre question, le point n ° 4 adresses des opérateurs d'égalité et sont susceptibles de vous intéresser. À peu près la même que T. J. Crowder a été affirmant dans sa réponse: toptal.com/javascript/10-most-common-javascript-mistakes
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, permettez-moi de souligner que
NaN
est un très spécial valeur: Par définition, il n'est pas égal à lui-même. Qui vient de la norme IEEE-754 que JavaScript numéros de dessiner. Le "pas un nombre" la valeur n'est jamais égal à lui-même, même lorsque les bits sont une correspondance exacte. (Ce qu'ils ne sont pas nécessairement dans la norme IEEE-754, il permet de multiples "pas un nombre" valeurs). C'est pourquoi cette même sort; toutes les autres valeurs de JavaScript sont égaux à eux-mêmes,NaN
est juste spécial.Non, vous n'êtes pas. La seule différence entre
!==
et!=
est que ce dernier va faire de ce type de coercition si nécessaire pour obtenir les types des opérandes de même. Dansx != x
, les types des opérandes sont les mêmes, et donc c'est exactement la même quex !== x
.C'est clair depuis le début de la définition de la Résumé De L'Égalité De L'Opération:
Les deux premières étapes sont à la base de la plomberie. En effet, la première étape de
==
est de voir si les types sont les mêmes et, le cas échéant, à faire===
à la place.!=
et!==
sont tout simplement annulés versions de l'.Donc si Flanagan est exact que seulement
NaN
donne le vrai pourx !== x
, on peut être sûr que c'est aussi vrai que seuleNaN
donne le vrai pourx != x
.De nombreux programmeurs JavaScript par défaut à l'aide de
===
et!==
pour éviter quelques pièges autour de la contrainte de type souple, opérateurs de le faire, mais il n'y a rien à lire dans Flanagan utilisation de la stricte vs loose opérateur dans ce cas.4.9.1 - Equality and Inequality Operators
section et ce semble être la réponse. Le point clé pour===
comparaison est:If the two values have the same type, test them for strict equality as described above. If they are strictly equal, they are equal. If they are not strictly equal, they are not equal
.import a from 'a'; console.log(a !== a)
peut retourner true pour les non valeurs NaNa
est en fait une fonction et ne retourne pas la même valeur à deux reprises? Ce n'est pas la même chose qu'un valeur pour ce qui!==
serait vrai, c'est ce que l'OP a demandé à propos. C'est juste une fonction qui renvoie des valeurs différentes.foo() !== foo()
n'est pas forcément vrai, puisquefoo
peut retourner des valeurs différentes à chaque appel.NaN
, peut-être0111 1111 1111 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
ou0111 1111 1111 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
. Pour cette question, un JS moteur est libre d'avoir des calculs qui en résultent dans les différents types deNaN
s -- et pourrait bien, si elle utilise le PROCESSEUR à virgule flottante de la fpo. Nous n'avons aucun moyen de dire, bien sûr, parce que JS traite tous de la même malgré le fait qu'ils sont distincts dans la norme IEEE-754.Pour les fins de NaN,
!=
et!==
faire la même chose.Cependant, de nombreux programmeurs éviter
==
ou!=
en JavaScript. Par exemple, Douglas Crockford considère parmi les "de mauvaises pièces" du langage JavaScript, car ils se comportent dans l'inattendu et déroutant façons:Juste pour le plaisir, laissez-moi vous montrer un exemple artificiel où
x
n'est pasNaN
mais les opérateurs se comportent différemment de toute façon. D'abord définir:Puis nous avons
mais
foo() != foo()
où foo retourne 1 puis 2. E. g., le valeurs ne sont pas les mêmes, c'est juste la comparaison des valeurs différentes.Je veux juste souligner
NaN
n'est pas la seule chose qui produitx !== x
sans l'aide de l'objet global. Il y a beaucoup de moyens astucieux pour déclencher ce problème. Ici est en utilisant les méthodes de lecture:Comme d'autres réponses à souligner,
==
effectue ce type encore de la contrainte, mais aussi dans d'autres langues et par la norme - NaN indique un calcul d'échec, et pour de bonnes raisons, n'est pas égale à elle-même.Pour une raison quelconque au-delà de moi des gens qui ocnsider-ce un problème avec JS, mais la plupart des langues qui ont des doubles (à savoir, C, Java, C++, C#, Python et autres) présentent ce comportement exact et les gens sont juste très bien avec elle.
Que parfois, les images valent mieux que des mots, cochez cette table (qui est la raison pour moi de faire une réponse au lieu d'un commentaire, c'est parce qu'il obtient une meilleure visibilité).
Là, vous pouvez voir une stricte égalité de comparaison (===) ne renvoie vrai si le type et le contenu du match, donc
Tout abstrait comparaison d'égalité (==) vérifie seulement le contenu* par conversion de types, puis strictement comparer:
Si ce n'est pas clair, sans consulter ECMA, du JavaScript qui considère que lors de la comparaison, de manière à ce que le code soufflet évalue à true.