Sie verwenden vielleicht häufig eine Javascript Utility Library für Ihre Anwendung. Entweder, um Ihren Entwicklungsprozess zu beschleunigen, oder Sie wollen einfach nur eine Utility-Funktion, die nachweislich funktioniert und getestet wurde. Einige beliebte Utility-Bibliotheken, die wir kennen, sind lodash und underscore.
Haben Sie jemals die Utility-Bibliothek verwendet, um zu überprüfen, ob eine Variable eine gültige Zahl ist? Gültig bedeutet, dass der Wert keinen Fehler verursacht oder kein unerwartetes Ergebnis liefert, wie NaN
. Wenn Sie eine Lodash- oder Underscore-Abhängigkeit haben, könnten Sie versucht sein, diese isNumber
-Funktion zu verwenden. Es scheint genau das zu tun, nicht wahr?
Lassen Sie uns einen Blick auf die lodash- und underscore-Implementierung für die isNumber
-Funktion werfen.
Beide der bekannten Bibliotheken haben eine ähnliche Implementierung. Sie vergleichen die Variable vom Typ Javascript-Klassenname mit dem -String. Das gilt nicht nur für den Typ „Number“, sondern auch für andere Typen wie „Date“, „function“ usw.
Sie mögen denken, dass das in Ordnung ist, aber ist Ihnen bewusst, dass NaN
in Javascript auch eine Zahl ist? NaN in Javascript ist eine Zahl, die den Wert darstellt: Not-A-Number
. Ziemlich verwirrend, oder? Sie können es selbst in der Javascript-Konsole überprüfen.
toString.call(NaN)
// ->
So ist die Verwendung der isNumber
-Methode nicht wirklich der richtige Weg für den obigen Anwendungsfall. Wir brauchen eine andere Validierung, die prüft, ob die Zahl nicht NaN
ist. Am Ende erhalten wir so etwas.
const isValidNumber = _.isNumber(obj) && !isNaN(obj)
Wie wäre es also mit der isDate
-Funktion? Was kann möglicherweise ein Problem verursachen?
Versuchen Sie, ein ungültiges Date-Objekt zu initialisieren, wie new Date("31/1/2019")
oder new Date("test123")
. Der resultierende Wert wird immer noch ein Date-Objekt sein, aber es wird ein ungültiges Date-Objekt sein. Das wird wahrscheinlich dazu führen, dass Ihre datumsbezogene Logik fehlerhaft ist. Daher sollten wir einen weiteren Schritt für die Validierung des Date-Objekts hinzufügen, vielleicht ist dies ausreichend:
const isValidDate = _.isDate(obj) && !isNaN(obj.getTime())
Recap: