Arrrgh! N'écoutez pas l'expression régulière réponses. RegEx est dégueulasse pour cela, et je ne parle pas seulement de la performance. C'est tellement facile de faire subtil, impossible à déceler les erreurs avec votre expression régulière.
Si vous ne pouvez pas utiliser isNaN()
, cela devrait fonctionner beaucoup mieux:
function IsNumeric(input)
{
return (input - 0) == input && (''+input).replace(/^\s+|\s+$/g, "").length > 0;
}
Voici comment il fonctionne:
L' (input - 0)
expression des forces de JavaScript pour faire de ce type de contrainte sur votre valeur d'entrée; il doit d'abord être interprétée comme un numéro pour l'opération de soustraction. Si la conversion d'un certain nombre d'échec, l'expression sera résultat en NaN
. Cette numérique résultat est ensuite comparé à la valeur d'origine que vous avez passé en. Depuis le côté gauche est désormais numérique, type de contrainte est de nouveau utilisé. Maintenant que les contributions des deux parties a été contrainte de même type à partir de la même valeur d'origine, on pourrait penser qu'elle devrait toujours être le même (toujours vrai). Cependant, il y a une règle spéciale qui, dit - NaN
n'est jamais égal à NaN
, et donc une valeur qui ne peut pas être converti en nombre (et uniquement des valeurs qui ne peuvent être converties en nombres) résultat sera faux.
La vérification de la longueur est pour un cas particulier impliquant des chaînes vides. Notez également qu'il tombe sur votre 0x89f test, mais c'est parce que dans de nombreux environnements, c'est un bon moyen de définir un nombre littéral. Si vous voulez attraper que le scénario vous pouvez ajouter un contrôle supplémentaire. Encore mieux, si c'est votre raison pour ne pas utiliser isNaN()
alors juste envelopper de votre propre fonction autour de isNaN()
qui peut aussi faire la vérification supplémentaire.
En résumé, si vous voulez savoir si une valeur peut être convertie en nombre, en fait on essaie de le convertir en nombre.
Je suis retourné et a fait quelques recherches pour pourquoi un blanc de la chaîne n'a pas eu les résultats attendus, et je pense que je comprends maintenant: une chaîne vide est contrainte d' 0
plutôt que d' NaN
. Découper la chaîne avant de la longueur de la vérification de gérer ce cas. Notez que j'ai opté pour une regex à base de garniture plutôt que de la .fonction trim() afin de soutenir IE8 (et oui, je suis conscient de l'ironie dans le démarrage de ma réponse par dissing les regex et puis, à l'aide de l'un dans le code, même si de façon limitée seulement). À propos de cette période de l'année prochaine lors de la Windows XP n'est plus supporté, je vais revenir et de le mettre à jour pour utiliser le .fonction trim () (et la suppression de ces deux phrases... si je me souviens).
Exécute les tests unitaires contre le nouveau code, et il échoue uniquement sur l'infini et littéraux booléens, et la seule fois que doit être un problème si vous êtes de la génération de code (vraiment, qui serait de type dans un sens littéral et vérifier si elle est numérique? Vous devriez le savoir), et qui serait une étrange code à générer.
Mais, encore une fois, la seule raison de l'utilisation de ce est si pour une raison quelconque, vous devez éviter les isNaN().