Qu'est-ce qui signifie (value inégal value) en JavaScript?

J'ai vu cet extrait dans le polyfill montré sur cette documentation MDN:

// Casts the value of the variable to a number. // So far I understand it ... count = +count; // ... and here my understanding ends. if (count != count) { count = 0; } 

Je n'ai aucune idée du but.

Comment quelque chose peut-il être inégal

En JavaScript, NaN est la seule valeur qui n'est pas égale à elle-même. Donc c'est un contrôle pour NaN.

C'est le test lorsque le nombre est NaN car seul NaN != NaN .

D'autres réponses ont déjà mentionné pourquoi cette vérification est requise. Mais il existe une autre façon d'attribuer une valeur par défaut si la valeur attendue est une valeur fausse comme NaN .

La condition if ne serait pas nécessaire si vous avez ceci:

 count = +count || 0; // so if count = NaN which is a falsy value then 0 will be assigned. 

Je vais essayer de résumer ce qui a déjà été dit

 if (count != count) { 

Vérifie si count est NaN . Selon les spécifications :

Un moyen fiable pour le code ECMAScript pour tester si une valeur X est un NaN est une expression de la forme X! == X. Le résultat sera vrai si et seulement si X est un NaN.

(Ce n'est pas grave dans ce cas, mais le polyfill utilise != lieu de !== comme requis par la norme).

Vous voudrez peut-être demander, pourquoi ne pas utiliser isNaN ? Parce que isNaN ne fait pas ce que son nom implique – il ne vérifie pas si une valeur est un NaN , il vérifie si la valeur sera NaN lorsqu'elle sera convertie en un Numéro. Par exemple, "foo" n'est clairement pas un NaN , il est encore isNaN("foo") sera True . À l'inverse, isNaN([[1]]) est False , bien que [[1]] ne soit pas un nombre valide.

Que count = +count || 0 count = +count || 0 ? C'est un raccourci valide, mais les polyfills MDN essaient de suivre la norme aussi près que possible. La spécification de String.repeat indique:

Soit n être ToInteger (compter).

ToInteger est

Let numéro être ToNumber (argument).

Si le nombre est NaN, renvoyez +0.

Notez qu'il ne dit pas "appel isNaN", il dit "si le numéro est NaN", et un moyen de trouver est de comparer le number avec lui-même.

Une autre option est Number.isNaN qui, contrairement au global isNaN , ne contraint pas son argument. Number.isNaN(x) renverra true si et seulement si x est effectivement NaN

 Number.isNaN("foo") => false Number.isNaN([[11]]) => false Number.isNaN(0/0) => true 

Donc, l'opérateur de comparaison cryptique if (count !== count) peut être remplacé par if (Number.isNaN(count)) .