En JavaScript, pourquoi isNaN(" ")
évalue-t-il false
, mais isNaN(" x")
évalue- true
t-il?
J'effectuer des opérations numériques sur un champ de saisie de texte, et je vérifie si le champ est null
, ""
ou NaN
. Lorsque quelqu'un tape une poignée d'espaces dans le champ, ma validation échoue sur les trois et je ne comprends pas pourquoi elle dépasse le isNaN
contrôle.
javascript
nan
IVR Avenger
la source
la source
"" == false // true
etisNaN(" ") // false
Réponses:
JavaScript interprète une chaîne vide comme un 0, ce qui échoue ensuite au test isNAN. Vous pouvez utiliser d'abord parseInt sur la chaîne, ce qui ne convertira pas la chaîne vide en 0. Le résultat devrait alors échouer isNAN.
la source
isNaN(arg)
. 1) Convertissez arg en nombre, 2) Vérifiez si ce nombre est la valeur numériqueNaN
. Cela m'a aidé à mieux comprendre.Vous pouvez trouver cela surprenant ou peut-être pas, mais voici un code de test pour vous montrer la folie du moteur JavaScript.
donc cela signifie que
et
mais
S'amuser :)
la source
null
,""
et" "
moi - même. Merci!Pour mieux le comprendre, veuillez ouvrir le pdf de spécification Ecma-Script à la page 43 "ToNumber appliqué au type de chaîne"
si une chaîne a une syntaxe numérique, qui peut contenir n'importe quel nombre de caractères d'espacement, elle peut être convertie en type Number. La chaîne vide vaut 0. La chaîne «Infinity» doit également donner
la source
Essayez d'utiliser:
Ou
la source
De la
MDN
raison du problème auquel vous êtes confrontéVous voudrez peut-être vérifier la réponse complète suivante qui couvre également la comparaison NaN pour l'égalité.
la source
Je pense que c'est à cause du typage de Javascript:
' '
est converti à zéro, alors que ce'x'
n'est pas le cas:la source
Si vous souhaitez implémenter une fonction isNumber précise, voici une façon de le faire à partir de Javascript: The Good Parts par Douglas Crockford [page 105]
la source
La réponse pas tout à fait correcte
La réponse très positive et acceptée d' Antonio Haley ici fait une fausse hypothèse que ce processus passe par la
parseInt
fonction de JavaScript :Nous pouvons facilement réfuter cette affirmation avec la chaîne
"123abc"
:Avec cela, nous pouvons voir que la
parseInt
fonction de JavaScript retourne"123abc"
sous forme de nombre123
, mais saisNaN
fonction nous dit que ce"123abc"
n'est pas un nombre.La bonne réponse
ECMAScript-262 définit le fonctionnement du
isNaN
contrôle dans la section 18.2.3 .La
ToNumber
fonction à laquelle elle fait référence est également définie dans la section 7.1.3 d'ECMAScript-262 . Ici, nous apprenons comment JavaScript gère les chaînes qui sont transmises à cette fonction.Le premier exemple donné dans la question est une chaîne ne contenant que des espaces blancs. Cette section stipule que:
L'
" "
exemple de chaîne est donc converti en+0
, qui est un nombre.La même section indique également:
Sans citer tous les contrôles contenus dans cette section, l'
" x"
exemple donné dans la question relève de la condition ci-dessus car il ne peut pas être interprété comme unStringNumericLiteral
." x"
est donc converti enNaN
.la source
Je ne sais pas pourquoi , mais pour contourner le problème, vous pouvez toujours couper les espaces avant de vérifier. Vous voulez probablement le faire de toute façon.
la source
La fonction
isNaN("")
effectue une coercition de type chaîne à nombreECMAScript 3-5 définit les valeurs de retour suivantes pour l'opérateur typeof:
Mieux vaut envelopper notre test dans un corps fonctionnel:
Cette fonction n'est pas destinée à tester le type de variable , mais teste la valeur forcée . Par exemple, les booléens et les chaînes sont forcés à des nombres, vous voudrez peut-être appeler cette fonction comme
isNumberCoerced()
s'il n'est pas nécessaire de tester des types autres que string et number , alors l'extrait de code suivant peut être utilisé dans le cadre d'une condition:
la source
Je vous suggère d'utiliser la fonction suivante si vous voulez vraiment vérifier correctement s'il s'agit d'un entier:
la source
C'est
isNaN(" ")
faux fait partie du comportement déroutant de laisNaN
fonction globale en raison de sa coercition des non-nombres vers un type numérique.De MDN :
Notez également qu'avec ECMAScript 6, il y a aussi maintenant la
Number.isNaN
méthode, qui selon MDN:Malheureusement :
Même la
Number.isNaN
méthode ECMAScript 6 a ses propres problèmes, comme indiqué dans le billet de blog - Résoudre le problème laid de JavaScript et ES6 NaN .la source
La
isNaN
fonction attend un nombre comme argument, donc les arguments de tout autre type (dans votre cas, une chaîne) seront convertis en nombre avant que la logique de la fonction réelle ne soit exécutée. (Sachez qu'ilNaN
s'agit également d'une valeur de type Number!)Btw. ceci est courant pour toutes les fonctions intégrées - si elles attendent un argument d'un certain type, l'argument réel sera converti en utilisant les fonctions de conversion standard. Il existe des conversions standard entre tous les types de base (booléen, chaîne, nombre, objet, date, null, indéfini.)
La conversion standard pour
String
toNumber
peut être invoquée explicitement avecNumber()
. Nous pouvons donc voir que:Number(" ")
évalue à0
Number(" x")
évalue àNaN
Compte tenu de cela, le résultat de la
isNaN
fonction est tout à fait logique!La vraie question est de savoir pourquoi la conversion standard de chaîne en nombre fonctionne comme elle le fait. La conversion chaîne en nombre est vraiment destinée à convertir des chaînes numériques comme "123" ou "17.5e4" en nombres équivalents. La conversion saute d'abord l'espace blanc initial (donc "123" est valide), puis essaie d'analyser le reste comme un nombre. S'il n'est pas analysable en tant que nombre ("x" ne l'est pas), le résultat est NaN. Mais il y a la règle spéciale explicite selon laquelle une chaîne qui est vide ou uniquement des espaces est convertie en 0. Cela explique donc la conversion.
Référence: http://www.ecma-international.org/ecma-262/5.1/#sec-9.3.1
la source
J'ai écrit cette petite fonction rapide pour aider à résoudre ce problème.
Il vérifie simplement tous les caractères qui ne sont pas numériques (0-9), qui ne sont pas «-» ou «.», Et qui ne sont pas indéfinis, nuls ou vides et renvoie true s'il n'y a pas de correspondance. :)
la source
Comme d'autres l'ont expliqué, la
isNaN
fonction contraindra la chaîne vide en un nombre avant de la valider, changeant ainsi une chaîne vide en 0 (qui est un nombre valide). Cependant, j'ai trouvé que laparseInt
fonction reviendraitNaN
en essayant d'analyser une chaîne vide ou une chaîne avec uniquement des espaces. En tant que telle, la combinaison suivante semble bien fonctionner:if ( isNaN(string) || isNaN(parseInt(string)) ) console.log('Not a number!');
Cette vérification fonctionnera pour les nombres positifs, les nombres négatifs et les nombres avec une virgule décimale, donc je pense qu'elle couvre tous les cas numériques courants.
la source
NaN
! == "pas un nombre"NaN
est une valeur de Type de nombrec'est une définition de isNaN () dans ECMAScript
Essayez de convertir n'importe quelle valeur en nombre.
Si vous souhaitez déterminer si la valeur est
NaN
, vous devez d'abord essayer de la convertir en valeur numérique.la source
Cette fonction a semblé fonctionner dans mes tests
la source
return !(s === "" || s === null || parseInt(s) == 'NaN');
Qu'en est-il de
la source
Le JavaScript intégré isNaN fonction, est - comme cela devrait être attendu par défaut - un « type dynamique de l' opérateur ». Par conséquent, toutes les valeurs qui (pendant le processus DTC) peuvent donner un simple true | false tel que
"", " ", " 000"
, ne peut pas être NaN.Cela signifie que l' argument fourni subira d'abord une conversion comme dans:
Explication:
Dans la ligne supérieure du corps de la fonction, nous essayons (d'abord) de convertir avec succès l'argument en un objet numérique. Et (deuxièmement), en utilisant l'opérateur point, nous supprimons immédiatement, pour notre propre convenance, la valeur primitive de l'objet créé.
Dans la deuxième ligne, on prend la valeur obtenue à l'étape précédente, et l'avantage du fait que NaN n'est égal à rien dans l'univers, pas même à lui-même, par exemple:
NaN == NaN >> false
pour enfin le comparer (pour l'inégalité) avec lui-même .De cette façon, la fonction return ne donnera vrai que lorsque, et seulement si, l'argument-retour fourni est une tentative infructueuse de conversion en un objet numérique, c'est-à-dire un nombre non-un-nombre; par exemple, NaN.
isNaNstatic ()
Cependant, pour un opérateur de type statique - si nécessaire et si nécessaire - nous pouvons écrire une fonction beaucoup plus simple telle que:
Et évitez complètement le DTC afin que si l'argument n'est pas explicitement un nombre NaN, il renverra faux. Par conséquent, testez les éléments suivants:
isNaNStatic(" x"); // will return false
parce que c'est toujours une chaîne.Cependant:
isNaNStatic(1/"x"); // will of course return true.
comme par exempleisNaNStatic(NaN); >> true
.Mais contrairement à
isNaN
, leisNaNStatic("NaN"); >> false
car il (l'argument) est une chaîne ordinaire.ps: La version statique d'isNaN peut être très utile dans les scénarios de codage modernes. Et cela peut très bien être l'une des principales raisons pour lesquelles j'ai pris mon temps pour publier ceci.
Cordialement.
la source
isNAN(<argument>)
est une fonction pour dire si l'argument donné est un nombre illégal.isNaN
type convertit les arguments en type Number. Si vous voulez vérifier si l'argument est numérique ou non? Veuillez utiliser la$.isNumeric()
fonction dans jQuery.Autrement dit, isNaN (foo) est équivalent à isNaN (Number (foo)) Il accepte toutes les chaînes ayant tous les chiffres comme des nombres pour des raisons évidentes. Par ex.
la source
Je l'utilise
la source
Lors de la vérification si une certaine valeur de chaîne avec un espace ou
" "
estisNaN
peut - être essayez d'effectuer une validation de chaîne, exemple:// value = "123 " if (value.match(/\s/) || isNaN(value)) { // do something }
la source