Ich habe einen nervigen Fehler auf einer Webseite:
date.GetMonth () ist keine Funktion
Also nehme ich an, dass ich etwas falsch mache. Die Variable date
ist kein Objekt vom Typ Date
. Wie kann ich in Javascript nach einem Datentyp suchen? Ich habe versucht, ein hinzuzufügen if (date)
, aber es funktioniert nicht.
function getFormatedDate(date) {
if (date) {
var month = date.GetMonth();
}
}
Wie mache ich das, wenn ich defensiven Code schreiben und verhindern möchte, dass das Datum (welches nicht eines ist) formatiert wird?
Vielen Dank!
UPDATE: Ich möchte das Format des Datums nicht überprüfen, aber ich möchte sicherstellen, dass der an die Methode übergebene Parameter getFormatedDate()
vom Typ ist Date
.
javascript
date
Martin
quelle
quelle
Invalid Date
: stackoverflow.com/a/44198641/5846045Antworten:
Als Alternative zum Ententippen über
Sie können den
instanceof
Operator verwenden, dh er gibt auch für ungültige Daten true zurück, z. B.new Date('random_string')
ist auch eine Instanz von DateDies schlägt fehl, wenn Objekte über Rahmengrenzen hinweg übergeben werden.
Eine Problemumgehung besteht darin, die Klasse des Objekts über zu überprüfen
quelle
window
oderself
). Verschiedene Frames haben ihre eigenen globalen Objekte, und ihre Eigenschaften (dh Globals) beziehen sich auf unterschiedliche Objekte:Date
In Frame1 ist ein anderes Funktionsobjekt alsDate
in Frame2; das gleiche gilt fürDate.prototype
, was der Grund für deninstanceof
Fehler ist:Date.prototype
von Frame1 ist nicht Teil der Prototypkette vonDate
Instanzen von Frame2new Date('something') instanceof Date
kehrttrue
in Chrome zurück. Das wird dann nicht funktionieren.Sie können den folgenden Code verwenden:
quelle
instanceof
Auslösen von falschem Negativ: jsbin.com/vufufoq/edit?html,js,consoleUm zu überprüfen, ob der Wert ein gültiger Typ des Standard-JS-Datumsobjekts ist, können Sie dieses Prädikat verwenden:
date
überprüft , ob der Parameter kein war falsy Wert (undefined
,null
,0
,""
, etc ..)Object.prototype.toString.call(date)
Gibt eine native Zeichenfolgendarstellung des angegebenen Objekttyps zurück. In unserem Fall"[object Date]"
. Dadate.toString()
die übergeordnete Methode überschrieben wird , müssen wir.call
oder.apply
die MethodeObject.prototype
direkt von welcher ..instanceof
oderDate.prototype.isPrototypeOf
.!isNaN(date)
prüft schließlich, ob der Wert nicht ein warInvalid Date
.quelle
isNaN
kann verwendet werden, um a zu überprüfenDate
. Das ist ein PHP-Level an Irrsinn.typeof Date.now() === "number"
, aber :typeof new Date() === "object"
. Realistischer ist ein Datum jedoch eine Zeit und ein Ort im Raum.Die Funktion ist
getMonth()
nichtGetMonth()
.Auf diese Weise können Sie überprüfen, ob das Objekt eine getMonth-Eigenschaft hat. Dies bedeutet nicht unbedingt, dass das Objekt ein Datum ist, sondern nur ein Objekt mit einer getMonth-Eigenschaft.
quelle
if (date.getMonth && typeof date.getMonth === "function") {...}
Wie oben angegeben, ist es wahrscheinlich am einfachsten, vor der Verwendung zu überprüfen, ob die Funktion vorhanden ist. Wenn es Ihnen wirklich wichtig ist, dass es sich um
Date
ein Objekt handelt und nicht nur um ein Objekt mit einergetMonth()
Funktion, versuchen Sie Folgendes:Dadurch wird entweder ein Klon des Werts erstellt, falls es sich um einen handelt
Date
, oder es wird ein ungültiges Datum erstellt. Sie können dann überprüfen, ob der Wert des neuen Datums ungültig ist oder nicht.quelle
Object.prototype.toString.call(value) === '[object Date]'
) verwenden, wenn es möglich ist, dass Sie Zahlen erhalten. Die Methode in dieser Antwort sagt Ihnen wirklich, ob dasvalue
in a konvertierbar istDate
.Für alle Typen habe ich eine Object-Prototyp-Funktion erstellt. Es kann für Sie von Nutzen sein
Jetzt können Sie jeden Typ wie folgt überprüfen :
[ März 2013 bearbeiten ] Basierend auf fortschreitenden Erkenntnissen ist dies eine bessere Methode:
quelle
UnderscoreJS und Lodash haben eine Funktion namens,
.isDate()
die genau das zu sein scheint, was Sie brauchen. Es lohnt sich, sich die jeweiligen Implementierungen anzusehen : Lodash isDate , UnderscoreJsquelle
Der beste Weg, den ich gefunden habe, ist:
quelle
Sie können überprüfen, ob eine für das Date-Objekt spezifische Funktion vorhanden ist:
quelle
Anstelle aller Problemumgehungen können Sie Folgendes verwenden:
Ich fand diesen Hack besser!
quelle
Sie können auch eine Kurzform verwenden
oder so ähnlich:
quelle
Ich habe einen viel einfacheren Weg verwendet, bin mir aber nicht sicher, ob dies nur in ES6 verfügbar ist oder nicht.
Dies funktioniert jedoch nicht mit null oder undefiniert, da sie keinen Konstruktor haben.
quelle
"Date"
ist genauso riskant wie die Überprüfung, ob der Parameter einegetMonth
Eigenschaft hat.Diese Funktion wird zurückgegeben,
true
wenn es sich um ein Datum oder einefalse
andere handelt:quelle
isDate(new (function AnythingButNotDate(){ })())
kehrt zurücktrue
Noch eine Variante:
quelle
instanceof
.iWindow.Date.prototype.isPrototypeOf(iWindow.date); // true
iWindow.date instanceof iWindow.Date; // true
Ein Ansatz mit einem Versuch / Fang
quelle
Tatsächlich ist das Datum vom Typ
Object
. Sie können jedoch überprüfen, ob das Objekt über einegetMonth
Methode verfügt und ob es aufrufbar ist.quelle
Wir können es auch anhand des folgenden Codes validieren
quelle
function Date() {/*...*/}
ist auchDate
. Das einfache Vergleichen der Konstruktorfunktion ist zu fehleranfällig, was häufig zu falsch positiven Ergebnissen führt. Benutzerdefinierten Objekttyp mit stackoverflow.com/a/44198641/5846045 umgehenInspiriert von dieser Antwort funktioniert diese Lösung in meinem Fall (ich musste überprüfen, ob der von der API empfangene Wert ein Datum ist oder nicht):
Auf diese Weise können Sie herausfinden, ob es sich um ein datumsähnliches Objekt handelt, wenn es sich um eine zufällige Zeichenfolge handelt, die von einem Client oder einem anderen Objekt stammt.
quelle
Könnten Sie nicht einfach verwenden
quelle
isValid
isValid
. Nur moment.js hat eine solche API.