Quelqu'un sait-il comment vérifier si une variable est un nombre ou une chaîne en JavaScript?
javascript
types
Jin Yong
la source
la source
Réponses:
Si vous avez affaire à la notation littérale, et non les constructeurs, vous pouvez utiliser typeof :.
Si vous créez des nombres et des chaînes par un constructeur, comme
var foo = new String("foo")
, vous devez garder à l' esprit quetypeof
peut revenirobject
pourfoo
.Peut-être qu'une méthode plus infaillible pour vérifier le type serait d'utiliser la méthode trouvée dans underscore.js (la source annotée peut être trouvée ici ),
Cela renvoie un booléen
true
pour les éléments suivants:la source
var myString = new String("stuff I like"); isString(myString)
ceci donc cela retourne false. De plus, je ne sais pas exactement combien de temps dure la conversion backgroiund, je sais que lorsque j'appelle "hi" .length, "hi" est converti en objet, je ne sais pas combien de temps il est à nouveau converti ou s'il est lié à la variable.La meilleure façon de le faire est d'utiliser le
isNaN
casting de type +:Méthode all-in mise à jour:
La même chose avec regex:
la source
null
est contraint à 0 et retourne vrai pourisNumber(null);
function is_number(n) { return /^-?[\d.]+(?:e-?\d+)?$/.test(n);}
La meilleure façon que j'ai trouvée est de vérifier une méthode sur la chaîne, c'est-à-dire:
ou si vous voulez faire quelque chose avec la vérification numérique d'une propriété numérique,
C'est un peu comme "taper du canard", c'est à vous de choisir la manière la plus logique. Je n'ai pas assez de karma pour commenter, mais typeof échoue pour les chaînes et les nombres encadrés, c'est-à-dire:
alertera "objet".
la source
typeof
car il peut toujours tester une chaîne, qu'elle soit primitive ou objet String. Il vous suffit de tester une méthode unique pour le type souhaité.{substring:"hello"}
. Je sais que pour mes besoins, je viens de tester ce que l'opération spécifique que je devais faire (module) fait pour le type que je devais vérifier (sur les chaînes, le module renvoie undefined), puis j'ai vérifié cela au lieu d'obtenir son type.Vous recherchez
isNaN()
:Voir la fonction JavaScript isNaN () sur MDN.
la source
isNaN
revientfalse
pournull
(maistrue
pourundefined
).Vérifiez si la valeur est un littéral de chaîne ou un objet chaîne:
Test de l'unité:
La vérification d'un numéro est similaire:
la source
function is (type, value) { return value["constructor"] === type; }
?Depuis ES2015, la façon correcte de vérifier si une variable contient un nombre valide est
Number.isFinite(value)
Exemples:
la source
Essaye ça,
la source
La meilleure façon de procéder:
Cela satisfait les cas de test suivants:
la source
Ou adaptez-le pour retourner un type inconnu:
Mise à jour du 12 mai 2012: exemple complet sur Javascript: un meilleur type de .
la source
realTypeOf
:realTypeOf(NaN) -> "Number"
qui est le même comportement quetypeof
convenu , mais encore loin d' être idéale.Voici une approche basée sur l'idée de contraindre l'entrée à un nombre ou une chaîne en ajoutant zéro ou la chaîne nulle, puis effectuez une comparaison d'égalité typée.
Pour une raison insondable,
x===x+0
semble mieux performer quex===+x
.Y a-t-il des cas où cela échoue?
Dans la même veine:
Cela semble être légèrement plus rapide que l'un
x===true || x===false
ou l' autretypeof x==="boolean"
(et beaucoup plus rapide quex===Boolean(x)
).Ensuite, il y a aussi
Tout cela dépend de l'existence d'une opération "d'identité" propre à chaque type qui peut être appliquée à n'importe quelle valeur et produire de manière fiable une valeur du type en question. Je ne peux pas penser à une telle opération pour les dates.
Pour NaN, il y a
Il s'agit essentiellement de la version de soulignement, et en l'état, elle est environ quatre fois plus rapide que
isNaN()
, mais les commentaires dans la source de soulignement mentionnent que "NaN est le seul nombre qui ne s'égale pas" et ajoute une vérification pour _.isNumber. Pourquoi? Quels autres objets ne s'égaleraient pas?x !== +x
Soulignez également les utilisations - mais quelle différence cela pourrait-+
il faire ici?Alors pour le paranoïaque:
ou ca
la source
Pouvez-vous simplement le diviser par 1?
Je suppose que le problème serait une entrée de chaîne comme: "123ABG"
Juste comme je l'ai fait récemment.
la source
euh, que diriez-vous juste:
Après un examen approfondi plusieurs mois plus tard, cela garantit uniquement
obj
qu'un objet a le nom de méthode ou de propriététoLowerCase
défini. J'ai honte de ma réponse. Veuillez en voirtypeof
un qui a été voté en premier.la source
Ou utilisez simplement l'inverseur de
isNaN()
:Et oui, utiliser jQuery
$.isNumeric()
est plus amusant pour l'argent.la source
isNaN('123')
donne faux, bien que l'argument soit une chaîne numérique et non de type numériqueJe pense que la conversion de la var en une chaîne diminue les performances, au moins ce test effectué dans les derniers navigateurs le montre.
Donc, si vous vous souciez de la performance, je le ferais, j'utiliserais ceci:
pour vérifier si la variable est une chaîne (même si vous utilisez
var str = new String("foo")
,str instanceof String
renvoie true).Quant à vérifier si c'est un nombre, je choisirais le natif
isNaN
:; une fonction.la source
jQuery utilise ceci:
la source
Cette solution résout bon nombre des problèmes soulevés ici!
C'est de loin la méthode la plus fiable que j'ai utilisée de loin. Je n'ai pas inventé cela et je ne me souviens pas où je l'ai trouvé à l'origine. Mais cela fonctionne là où d'autres techniques échouent:
Exemple d'exactitude
la source
typeof
méthode native (0,788 s contre 1,481 s) sur Chrome. C'est certainement une performance acceptable compte tenu des résultats améliorés. Pourquoi pensez-vous que c'est "vraiment lent?" Peut-être que c'est - dans IE6 / 7/8? Mais tout est "vraiment lent" dans ces navigateurs.typeof
est 100 fois plus rapide, qu'est-ce qui me manque?Jsut an FYI, si vous utilisez jQuery, vous avez
pour gérer cela. Plus de détails sur http://api.jquery.com/jQuery.isNumeric/
la source
typeof fonctionne très bien pour moi dans la plupart des cas. Vous pouvez essayer d'utiliser une instruction if
où x est un nom de variable de votre choix
la source
la meilleure façon que j'ai trouvée qui pense aussi aux nombres positifs et négatifs est de: O'Reilly Javascript et DHTML Cookbook :
}
la source
Euh? Utilisez simplement des expressions régulières! :)
la source
comme une chaîne comme «1234» avec typeof affichera «chaîne», et l'inverse ne peut jamais se produire (typeof 123 sera toujours un nombre), le mieux est d'utiliser une simple expression régulière
/^\-?\d+$/.test(var)
. Ou plus avancé pour faire correspondre les flottants, les entiers et les nombres négatifs,/^[\-\+]?[\d]+\.?(\d+)?$/
le côté important.test
est qu'il ne lèvera PAS d'exception si le var n'est pas une chaîne, la valeur peut être n'importe quoi.Si vous cherchez le vrai type, alors seul typeof fera l'affaire.
la source
@ La réponse de BitOfUniverse est bonne, et je trouve une nouvelle façon:
Je sais que ça ne
0
peut pas être un dividende, mais ici la fonction fonctionne parfaitement.la source
Vérification de type
Vous pouvez vérifier le type de variable en utilisant l'
typeof
opérateur:Vérification de la valeur
Le code ci-dessous renvoie vrai pour les nombres et faux pour toute autre chose:
la source
typeof
opérateur! @JustAMartinnumber
mais si je passe `` 123 '' ou `` abc '' ou tout autre littéral cité, c'est une chaîne, et peu importe si elle peut être analysée en nombre ou non.L'opération XOR peut être utilisée pour détecter un nombre ou une chaîne. nombre ^ 0 donnera toujours le nombre en sortie et la chaîne ^ 0 donnera 0 en sortie.
la source
Simple et complet:
Cas de test:
la source
Utilisez simplement
ou
si vous souhaitez gérer des chaînes définies en tant qu'objets ou littéraux et enregistre, vous ne voulez pas utiliser une fonction d'assistance.
la source
la source
Très tard pour la fête; cependant, ce qui suit a toujours bien fonctionné pour moi lorsque je veux vérifier si une entrée est soit une chaîne soit un nombre en une seule fois.
la source
Créé un jsperf sur la vérification si une variable est un nombre. Plutôt interessant! typeof a en fait une utilisation de performance. Utilisant
typeof
autre chose que des nombres, augmente généralement d'un tiers la vitessevariable.constructor
car la majorité des types de données en javascript sont des objets; les chiffres ne le sont pas!http://jsperf.com/jemiloii-fastest-method-to-check-if-type-is-a-number
typeof variable === 'number'
| le plus rapide | si vous voulez un nombre, comme 5, et non '5'typeof parseFloat(variable) === 'number'
| le plus rapide | si vous voulez un nombre, comme 5 et '5'isNaN()
est plus lent, mais pas beaucoup plus lent. J'avais de grands espoirsparseInt
etparseFloat
, cependant, ils étaient horriblement plus lents.la source
Pour détecter les nombres, le passage suivant de JavaScript: The Good Parts de Douglas Crockford est pertinent:
la source