web-dev-qa-db-fra.com

Comparaison des valeurs NaN pour l'égalité en Javascript

J'ai besoin de comparer deux valeurs numériques pour l'égalité en Javascript. Les valeurs peuvent également être NaN. J'ai trouvé ce code:

if (val1 == val2 || isNaN(val1) && isNaN(val2)) ...

qui fonctionne bien, mais il me semble gonflé. Je voudrais être plus concis. Des idées?

59
GOTO 0

Essayez d'utiliser Object.is(), il détermine si deux valeurs sont la même valeur. Deux valeurs sont identiques si l'une des valeurs suivantes est vérifiée:

  • undefined
  • null
  • les deux true ou les deux false
  • les deux chaînes de même longueur avec les mêmes caractères dans le même ordre
  • à la fois le même objet
  • les deux chiffres et
    • les deux +0
    • les deux -0
    • les deux NaN
    • ou les deux non nulles et les deux non NaN et les deux ont la même valeur

par exemple. Object.is(NaN, NaN) => true

Reportez-vous à https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is

5
Anant
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))

Rien à améliorer. Ajoutez simplement les parenthèses pour que tout le monde le comprenne.

51
ThiefMaster

Évitez isNaN. Son comportement est trompeur:

isNaN(undefined) // true

_.isNaN (de nderscore.js ) est une fonction élégante qui se comporte comme prévu:

// Is the given value `NaN`?
// 
// `NaN` is the only value for which `===` is not reflexive.
_.isNaN = function(obj) {
  return obj !== obj;
};

_.isNaN(undefined) // false
_.isNaN(0/0) // true
23
davidchambers

if ( val1 === val2 )

Si l'un ou les deux sont NaN, la valeur est false.

Également, NaN !== NaN

5
Esailija

NaN n'est jamais égal à lui-même, peu importe la méthode de comparaison, donc la seule solution plus concise à votre problème à laquelle je peux penser serait de créer un appel de fonction avec un nom descriptif pour faire cette comparaison plutôt spéciale et utiliser cette fonction de comparaison dans votre code à la place.

Cela aurait également l'avantage de localiser les modifications apportées à l'algorithme le jour où vous décidez que non défini devrait également être égal à non défini.

5
Joachim Isaksson

Tant que vous savez que ces deux variables sont numériques, vous pouvez essayer:

if (val1 + '' == val2 + '')

Il transforme les deux valeurs en chaînes. Une réponse amusante, mais ça devrait marcher. :)

5
Grace Shao

Et qu'en est-il de la fonction Number.isNaN () ? Je crois que cela doit être utilisé chaque fois que cela est possible.

> NaN === NaN
false
> Number.isNaN
ƒ isNaN() { [native code] }
> Number.isNaN() === Number.isNaN()
true

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isNaN

2
mario ruiz

Pour les cas numériques, la solution est bonne, mais pour l'étendre à d'autres types de données, ma suggestion serait la suivante:

if(val1 === val2 || (val1 !== val1 && val2 !== val2))

La raison d'être globale isNaN est erronée. Cela vous donnera de mauvais résultats dans des scénarios comme

isNaN(undefined); // true
isNaN({});        // true
isNaN("lorem ipsum"); // true 

J'ai posté ici une réponse complète qui couvre également la comparaison NaN pour l'égalité.

Comment tester si une variable JavaScript est NaN

2
dopeddude

J'ai créé cette réponse après avoir examiné les suggestions de ThiefMaster, Esailija, Joachim Isaksson et davidchambers. Cela peut-il être encore amélioré?

// Determines if two numeric values are equal.
// Also returns true when both parameters are NaN.
function areEqualNumeric(val1, val2) {
    return val1 === val2 || (val1 !== val1 && val2 !== val2);
}
1
GOTO 0