Możesz często używać biblioteki narzędziowej javascript dla swojej aplikacji. Albo po to, aby przyspieszyć proces tworzenia aplikacji, albo po prostu po to, aby mieć jakąś funkcję użytkową, która działa i została przetestowana. Niektóre popularne biblioteki użytkowe, które znamy to lodash i underscore.

Czy kiedykolwiek używałeś biblioteki użytkowej do sprawdzenia czy zmienna jest poprawną liczbą? Poprawna oznacza, że wartość nie spowoduje błędu lub nie zwróci nieoczekiwanego wyniku, jak NaN. Jeśli masz zależność od lodash lub underscore, możesz być kuszony, aby użyć tej funkcji isNumber. Wygląda na to, że właśnie to robi, prawda?

Przyjrzyjmy się zarówno implementacji lodash jak i underscore dla funkcji isNumber.

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

Obydwie popularne biblioteki mają podobną implementację. Porównują one zmienną typu Javascript class name z ciągiem znaków . Dotyczy to nie tylko typu Number, ale również innych typów takich jak Date, function, etc.

Możesz myśleć, że to jest w porządku, ale czy zdajesz sobie sprawę, że NaN jest również Number w Javascript? NaN w javascript jest Liczbą, która reprezentuje wartość: Not-A-Number. Trochę zagmatwane, prawda? Możesz to sprawdzić samemu w konsoli javascript.

toString.call(NaN)
// ->

Więc, użycie metody isNumber nie jest tak naprawdę poprawnym sposobem dla powyższego przypadku użycia. Potrzebujemy innej walidacji, czyli sprawdzenia czy numer nie jest NaN . W efekcie otrzymamy coś takiego.

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

Co więc z funkcją isDate? Co może potencjalnie spowodować problem?

Próbuj zainicjować nieprawidłowy obiekt Date, Jak new Date("31/1/2019") lub new Date("test123") . Wartość wynikowa nadal będzie obiektem Date, ale będzie to nieprawidłowy obiekt Date. To prawdopodobnie spowoduje, że twoja logika związana z datą będzie wadliwa. Dlatego powinniśmy dodać kolejny krok do walidacji obiektu Date, być może ten jest wystarczający:

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

Podsumowanie:

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *