In Bezug auf Computer new Date()
und regular expression
Lösungen sind langsam! Wenn Sie einen superschnellen (und superkryptischen) Einzeiler wünschen, versuchen Sie diesen (vorausgesetzt, er m
ist inJan=1
Format). Ich versuche immer wieder, verschiedene Codeänderungen vorzunehmen, um die beste Leistung zu erzielen.
Meine aktuell schnellste Version:
Nachdem ich mir diese verwandte Frage mit Hilfe von bitweisen Operatoren (erstaunliche Geschwindigkeit) angesehen und herausgefunden habe, was die magische Zahl von 25 und 15 darstellt, habe ich diese optimierte Mischung von Antworten gefunden:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Angesichts der Bitverschiebung wird offensichtlich davon ausgegangen, dass Ihre m
& y
-Parameter beide Ganzzahlen sind, da das Übergeben von Zahlen als Zeichenfolgen zu seltsamen Ergebnissen führen würde.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
JSPerf-Ergebnisse: http://jsperf.com/days-in-month-head-to-head/5
Aus irgendeinem Grund (m+(m>>3)&1)
ist effizienter als (5546>>m&1)
in fast allen Browsern.
Die einzige echte Konkurrenz für Geschwindigkeit ist @GitaarLab, daher habe ich eine Kopf-an-Kopf-JSPerf erstellt, die wir testen können: http://jsperf.com/days-in-month-head-to-head/5
Es funktioniert basierend auf meiner Antwort auf das Schaltjahr hier: Javascript Schaltjahr finden diese Antwort hier Leap Jahr Prüfung mit Bitoperatoren (erstaunliche Geschwindigkeit) sowie die folgenden binäre Logik.
Eine kurze Lektion in zwei Monaten:
Wenn Sie den Index der gewünschten Monate interpretieren (Jan = 1) binär Sie feststellen, dass in Monaten mit 31 Tagen entweder Bit 3 gelöscht und Bit 0 gesetzt oder Bit 3 gesetzt und Bit 0 gelöscht ist.
Jan = 1 = 0001 : 31 days
Feb = 2 = 0010
Mar = 3 = 0011 : 31 days
Apr = 4 = 0100
May = 5 = 0101 : 31 days
Jun = 6 = 0110
Jul = 7 = 0111 : 31 days
Aug = 8 = 1000 : 31 days
Sep = 9 = 1001
Oct = 10 = 1010 : 31 days
Nov = 11 = 1011
Dec = 12 = 1100 : 31 days
Das bedeutet können Sie den Wert 3 Plätze mit verschieben >> 3
, XOR die Bits mit dem Original ^ m
und sehen , ob das Ergebnis 1
oder 0
in Bit - Position 0 mit & 1
. Hinweis: Es stellt sich heraus, dass +
es etwas schneller als XOR ist (^
) ist und (m >> 3) + m
in Bit 0 das gleiche Ergebnis liefert.
JSPerf-Ergebnisse : http://jsperf.com/days-in-month-perf-test/6