Vous pourriez fréquemment utiliser une bibliothèque d’utilitaires Javascript pour votre application. Soit pour accélérer votre processus de développement, soit pour simplement vouloir une fonction utilitaire dont le fonctionnement est avéré et qui a été testée. Certaines bibliothèques utilitaires populaires que nous connaissons sont lodash et underscore.
Vous avez déjà utilisé la bibliothèque utilitaire pour valider si une variable est un nombre valide ? Valide signifie que la valeur ne provoquera pas d’erreur ou ne retournera pas un résultat inattendu, comme NaN
. Si vous avez une dépendance à lodash ou à underscore, vous pourriez être tenté d’utiliser cette fonction isNumber
. Elle semble faire exactement cela, n’est-ce pas ?
Regardons l’implémentation lodash et underscore pour la fonction isNumber
.
Les deux bibliothèques populaires ont une implémentation similaire. Elles vont comparer le type de nom de classe Javascript de la variable avec la chaîne . Cela s’applique non seulement au type Nombre mais aussi à d’autres types comme Date, fonction, etc.
Vous pourriez penser que c’est bien, mais savez-vous que NaN
est aussi un Nombre en Javascript ? NaN en javascript est un Nombre qui représente la valeur : Not-A-Number
. C’est un peu déroutant, non ? Vous pouvez le vérifier vous-même dans la console javascript.
toString.call(NaN)
// ->
Donc, utiliser la méthode isNumber
n’est pas vraiment la bonne façon pour le cas d’utilisation ci-dessus. Nous avons besoin d’une autre validation, qui consiste à vérifier si le numéro n’est pas NaN
. Nous nous retrouverons avec quelque chose comme ceci.
const isValidNumber = _.isNumber(obj) && !isNaN(obj)
Alors, qu’en est-il de la fonction isDate
? Qu’est-ce qui peut potentiellement causer un problème ?
Tentez d’initialiser un objet Date invalide, comme new Date("31/1/2019")
ou new Date("test123")
. La valeur résultante sera toujours un objet Date mais ce sera un objet Date invalide. Cela va probablement causer votre logique liée à la date défectueuse. Par conséquent, nous devrions ajouter une autre étape pour valider l’objet Date, peut-être que ceci est suffisant:
const isValidDate = _.isDate(obj) && !isNaN(obj.getTime())
Recap: