Pourquoi est-il indéfini == indéfini mais NaN! = NaN?

Je me demande pourquoi undefined == undefined mais NaN != NaN .

Parce que c'est ainsi qu'il est défini à la fois dans l' Algorithme de comparaison d'égalité abstraite et dans l' Algorithme de comparaison d'égalité stricte .

Si l'opérande à == ou === est NaN , il renvoie false .

Abstrait

  • Si Type (x) est Numéro, alors
    • Si x est NaN, renvoyez false.
    • Si y est NaN, renvoyez faux.
    • Si x est la même valeur de numéro que y, retournez true.
    • Si x est +0 et y est -0, retournez true.
    • Si x est -0 et y est +0, renvoyez true.
    • Retourner faux.

EDIT: La motivation pour la comparaison inégale telle qu'indiquée par @CMS est la conformité à la norme IEEE 754.

À partir du lien Wikipedia fourni dans le commentaire ci-dessous:

… Les opérations de comparaison normales traitent néanmoins les NaN comme non ordonnées et comparent -0 et +0 comme égales. Le prédicat TotalOderder ordonnera ces cas, et il distingue également les différentes représentations de NaN et entre le même nombre virgule décimale codé de différentes façons.

Parce que Math.sqrt(-5) !== Math.sqrt(-6) .

Je ne sais pas pourquoi c'est comme ça, mais pour vérifier si une certaine déclaration ou variable est un NaN, vous devez utiliser la méthode isNaN

Je suppose que la norme IEEE permet plus d'une représentation de NaN. Tous les NaN ne sont pas égaux …

Le raisonnement est que les créateurs voulaient que x == x renvoie faux signifie que x est NaN, donc NaN == NaN doit renvoyer le faux pour être cohérent.