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?
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
true
ou les deux false
+0
-0
NaN
NaN
et les deux ont la même valeurpar exemple. Object.is(NaN, NaN)
=> true
Reportez-vous à https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
if(val1 == val2 || (isNaN(val1) && isNaN(val2)))
Rien à améliorer. Ajoutez simplement les parenthèses pour que tout le monde le comprenne.
É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
if ( val1 === val2 )
Si l'un ou les deux sont NaN
, la valeur est false.
Également, NaN !== NaN
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.
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. :)
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
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é.
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);
}