U gebruikt wellicht vaak een javascript utility bibliotheek voor uw applicatie. Ofwel om uw ontwikkelingsproces te versnellen of gewoon willen een aantal utiliteit functie die bewezen werkt en zijn getest. Enkele populaire utility bibliotheken die we kennen zijn lodash en underscore.

Heb je ooit de utility library gebruikt om te valideren of een variabele een geldig getal is? Geldig betekent dat de waarde geen fout zal veroorzaken of geen onverwacht resultaat zal opleveren, zoals NaN. Als je lodash of underscore afhankelijkheid hebt, zou je in de verleiding kunnen komen om die isNumber functie te gebruiken. Het lijkt precies dat te doen, toch?

Laten we eens kijken naar zowel lodash als underscore implementatie voor isNumber functie.

https://github.com/jashkenas/underscore/blob/e51aa7251f3e010fe003fbb9d969a74b9dcda103/underscore.js#L1325-L1330
https://github.com/lodash/lodash/blob/04ebca6c86deba0ff733847f6c11fd5265e1ce03/isNumber.js#L29-L32

Beide populaire bibliotheken hebben een vergelijkbare implementatie. Ze vergelijken het type Javascript-klassenaam van de variabele met de tekenreeks. Dat geldt niet alleen voor het type Getal, maar ook voor andere types zoals Datum, functie, etc.

Je denkt misschien dat het prima is, maar weet je dat NaN ook een Getal is in Javascript? NaN in javascript is een Getal dat de waarde weergeeft: Not-A-Number. Nogal verwarrend, niet? Je kunt het zelf controleren in de javascript console.

toString.call(NaN)
// ->

Dus, het gebruik van isNumber methode is niet echt de juiste manier voor de bovenstaande use case. We hebben een andere validatie nodig, die controleert of het nummer niet NaN is. We eindigen met iets als dit.

const isValidNumber = _.isNumber(obj) && !isNaN(obj)

Dus hoe zit het met de isDate functie? Wat kan mogelijk een probleem veroorzaken?

Probeer eens een ongeldig Date object te initialiseren, zoals new Date("31/1/2019") of new Date("test123") . De resulterende waarde zal nog steeds een Datum object zijn, maar het zal een ongeldig Datum object zijn. Dat zal er waarschijnlijk voor zorgen dat je Datum gerelateerde logica niet klopt. Daarom moeten we nog een stap toevoegen voor het valideren van het Date object, misschien is dit voldoende:

const isValidDate = _.isDate(obj) && !isNaN(obj.getTime()) 

Recap:

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *