Datenvergleich in JavaScript: Optimierung und Leistung

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Datenvergleich in JavaScript: Wie man Fallstricke vermeidet und Code beschleunigt

\n\n

Stellen Sie sich vor: Sie programmieren einen Online-Shop und müssen prüfen, ob ein Rabatt auf einen Artikel abgelaufen ist. Oder Sie erstellen einen Aufgabenkalender, bei dem Sie Ereignisse für heute filtern müssen. Oder Sie sammeln Analysen – „Zeige alle Bestellungen der letzten Woche“. Überall müssen Sie zwei Daten vergleichen. Das scheint einfach, oder? Aber JavaScript ist, wie immer, bereit für Überraschungen.

\n\n

Die Frage "Compare two dates with JavaScript" auf Stack Overflow hat tausende Aufrufe – und das nicht ohne Grund. Entwickler, selbst erfahrene, stolpern oft über nicht offensichtliche Besonderheiten bei der Arbeit mit Daten. In diesem Artikel zeigen wir nicht nur, wie man zwei Daten vergleicht, sondern analysieren auch, welche Methode schneller und welche sicherer ist. Los geht's!

\n\n

Warum funktioniert der einfache Datenvergleich nicht?

\n\n

Beginnen wir mit dem klassischen Anfängerfehler. Angenommen, wir haben zwei Daten:

\n\n
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\n\nconsole.log(date1 < date2);  // true\nconsole.log(date1 > date2);  // false\nconsole.log(date1 == date2); // false\n
\n\n

Mit den Operatoren < und > funktioniert alles einwandfrei. JavaScript wandelt Date-Objekte in Zahlen (Millisekunden) um und vergleicht sie. Aber der Operator == (und der strikte ===) verhält sich anders. Er vergleicht Referenzen auf Objekte, nicht deren Werte. Zwei verschiedene Daten sind zwei verschiedene Objekte, daher gibt == immer false zurück, selbst wenn die Daten millisekundengenau übereinstimmen.

\n\n

Das ist die erste Falle. Daraus folgt die Moral: Verwenden Sie niemals == oder === zum Vergleichen von Daten. Nur <, >, <=, >= oder spezielle Methoden.

\n\n

Die Methode getTime(): Der Goldstandard für Datenvergleiche

\n\n

Der zuverlässigste und leistungsfähigste Weg ist die Verwendung der Methode getTime(). Sie gibt die Anzahl der Millisekunden seit dem 1. Januar 1970 (Unix-Epoche) zurück. Und Zahlen kann JavaScript hervorragend vergleichen:

\n\n
let date1 = new Date('2024-03-15T10:00:00');\nlet date2 = new Date('2024-03-15T10:00:00');\nlet date3 = new Date('2024-03-20T10:00:00');\n\nconsole.log(date1.getTime() === date2.getTime()); // true\nconsole.log(date1.getTime() < date3.getTime());   // true\nconsole.log(date1.getTime() > date3.getTime());   // false\n
\n\n

Warum ist das effizient? Weil getTime() eine sehr leichte Operation ist. Sie gibt einfach den bereits im Date-Objekt gespeicherten Zahlenwert zurück. Kein Parsen, keine zusätzlichen Berechnungen. Einfach eine Zahl.

\n\n

Lassen Sie uns die Leistung messen. Hier ist ein kleiner Test in der Browserkonsole:

\n\n
let date1 = new Date('2024-01-01');\nlet date2 = new Date('2024-12-31');\n\nconsole.time('getTime');\nfor (let i = 0; i < 1000000; i++) {\n    date1.getTime() < date2.getTime();\n}\nconsole.timeEnd('getTime');\n// Ergebnis: ~5-10 ms in modernen Browsern\n
\n\n

Eine Million Vergleiche in 10 Millisekunden – das ist ein hervorragendes Ergebnis. Zum Vergleich: Alternative Methoden können 2-3 mal langsamer sein.

\n\n

Datenvergleich mit valueOf()

\n\n

Die Methode valueOf() macht dasselbe wie getTime() – sie gibt die numerische Darstellung des Datums zurück. Aber es gibt eine Nuance: Bei Verwendung von Vergleichsoperatoren (<, > usw.) ruft JavaScript implizit valueOf() für Date-Objekte auf. Das heißt, dieser Code:

\n\n
let date1 = new Date('2024-03-15');\nlet date2 = new Date('2024-03-20');\nconsole.log(date1 < date2);\n
\n\n

Funktioniert tatsächlich wie:

\n\n
console.log(date1.valueOf() < date2.valueOf());\n
\n\n

Daher können Sie für einfache Vergleiche mit < und > die Date-Objekte direkt verwenden. Für exakte Gleichheit (===) funktioniert das jedoch nicht, und hier kommen Sie ohne getTime() oder valueOf() nicht aus.

Blogs

Buchempfehlungen