880 Stimmen

Wie kann man prüfen, ob ein Objekt ein Datum ist?

Ich habe einen lästigen Fehler auf einer Webseite:

date.GetMonth() ist keine Funktion

Ich vermute also, dass ich etwas falsch mache. Die Variable date ist kein Objekt des Typs Date . Wie kann ich in Javascript nach einem Datentyp suchen? Ich habe versucht, eine if (date) aber es funktioniert nicht.

function getFormatedDate(date) {
    if (date) {
       var month = date.GetMonth();
    }
}

Wenn ich also einen defensiven Code schreiben und verhindern möchte, dass das Datum (das keines ist) formatiert wird, wie kann ich das tun?

Danke!

UPDATE: Ich möchte nicht das Format des Datums überprüfen, aber ich möchte sicher sein, dass der Parameter, der an die Methode getFormatedDate() ist vom Typ Date .

0 Stimmen

Falls es auch validiert werden sollte, ob die Datum ist kein Invalid Date : stackoverflow.com/a/44198641/5846045

1507voto

Christoph Punkte 157217

Als Alternative zur Enten-Typisierung über

typeof date.getMonth === 'function'

können Sie die instanceof Operator, d.h. aber auch bei ungültigen Daten wird true zurückgegeben, z.B. new Date('random_string') ist auch eine Instanz von Date

date instanceof Date

Dies schlägt fehl, wenn Objekte über Rahmengrenzen hinweg übergeben werden.

Ein Workaround für dieses Problem ist die Überprüfung der Objektklasse über

Object.prototype.toString.call(date) === '[object Date]'

37 Stimmen

Kennen Sie den Grund dafür, dass dies beim Überschreiten von Framegrenzen nicht funktioniert?

107 Stimmen

@Simon: JS-Globals sind lokal für das aktuelle globale Objekt (aka window o self ); verschiedene Rahmen haben ihre eigenen globalen Objekte, und ihre Eigenschaften (d.h. Globals) beziehen sich auf verschiedene Objekte: Date in frame1 ist ein anderes Funktionsobjekt als Date in frame2; das gleiche gilt für Date.prototype was der Grund für die instanceof Versagen: Date.prototype von frame1 ist nicht Teil der Prototypenkette von Date Instanzen von frame2

2 Stimmen

Zur Ausarbeitung der instanceof Methode über Rahmengrenzen hinweg versagt, siehe JavaScript Garten : "... instanceof funktioniert nicht bei Objekten, die aus verschiedenen JavaScript-Kontexten stammen (z.B. verschiedene Dokumente in einem Webbrowser), da ihre Konstruktoren nicht exakt das gleiche Objekt sind."

200voto

SF_dev Punkte 1883

Sie können den folgenden Code verwenden:

(myvar instanceof Date) // returns true or false

10 Stimmen

Warum ist dies nicht die akzeptierte oder am meisten hochgestimmte Antwort? Die einfache Überprüfung, ob date eine .getMonth-Eigenschaft hat, könnte ein falsches Positiv auslösen.

32 Stimmen

Instanz kann falsche Negative auslösen, siehe den Kommentar von Christoph zu seiner eigenen Antwort.

3 Stimmen

@doremi Hier ist eine Demo von instanceof falsch-negativ auslösen: jsbin.com/vufufoq/edit?html,js,console

121voto

Boghyon Hoffmann Punkte 15341

Um zu prüfen, ob der Wert ein gültiger Typ des Standard JS-date-Objekts ist, können Sie dieses Prädikat verwenden:

function isValidDate(date) {
  return date && Object.prototype.toString.call(date) === "[object Date]" && !isNaN(date);
}
  1. date prüft, ob der Parameter nicht ein falscher Wert ( undefined , null , 0 , "" , etc..)
  2. Object.prototype.toString.call(date) gibt eine native String-Darstellung des angegebenen Objekttyps - in unserem Fall "[object Date]" . Denn date.toString() überschreibt seine übergeordnete Methode müssen wir .call o .apply die Methode aus Object.prototype direkt die ..
  3. !isNaN(date) prüft schließlich, ob der Wert nicht ein Invalid Date .

17 Stimmen

Wow isNaN kann verwendet werden, um eine Date . Das ist ein PHP-Niveau der Unvernunft.

3 Stimmen

@Nick ein Datum ist aber eine Zahl.

1 Stimmen

@Josiah Nun, sicher, wenn man den Kontext entfernt, gibt es einen Zeitstempel: typeof Date.now() === "number" , sondern: typeof new Date() === "object" . Realistischer betrachtet, ist ein Datum jedoch eine Zeit und ein Ort im Raum.

40voto

Chetan S Punkte 23115

Die Funktion ist getMonth() no GetMonth() .

Wie auch immer, Sie können überprüfen, ob das Objekt eine getMonth-Eigenschaft hat, indem Sie dies tun. Das bedeutet nicht unbedingt, dass es sich um ein Datum handelt, sondern um ein beliebiges Objekt, das eine getMonth-Eigenschaft hat.

if (date.getMonth) {
    var month = date.getMonth();
}

4 Stimmen

Prüfen Sie, ob sie aufrufbar ist: if (date.getMonth && typeof date.getMonth === "function") {...}

30voto

Ryan King Punkte 3308

Dies ist ein ziemlich einfacher Ansatz, wenn Sie sich keine Gedanken über iframes / andere Kontexte machen.

// isNaN(Invalid Date) == true
if (date instanceof Date && !isNaN(date)) {
    console.log("is date!");
}
  • Prüft, ob das Objekt tatsächlich ein Date und nicht etwas, das wie ein solches aussieht. Jedes Objekt könnte eine getMonth Funktion.
  • Stellt sicher, dass das Datum nicht ein Invalid Date
  • Übergibt keinen Wert in new Date() wo eine Zahl oder sogar eine Zeichenkette in ein Datum umgewandelt werden kann.

Wenn Sie iframes und verschiedene Kontexte unterstützen müssen, können Sie die akzeptierte Antwort verwenden, aber eine zusätzliche Prüfung hinzufügen, um ungültige Daten zu erkennen.

// isNaN(Invalid Date) == true
if (Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date)) {
    console.log("is date!");
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X