В компьютерном плане new Date()
и regular expression
решения медленные! Если вам нужен супер-быстрый (и супер-загадочный) однострочный текст, попробуйте этот вариант (при условии, что m
он в Jan=1
формате). Я продолжаю пробовать разные изменения кода, чтобы добиться максимальной производительности.
Моя текущая самая быстрая версия:
Посмотрев на этот вопрос, связанный с проверкой високосного года с использованием побитовых операторов (потрясающая скорость) и обнаружив, что представляет собой магическое число 25 и 15, я пришел к этому оптимизированному гибриду ответов:
function getDaysInMonth(m, y) {
return m===2 ? y & 3 || !(y%25) && y & 15 ? 28 : 29 : 30 + (m+(m>>3)&1);
}
Учитывая сдвиг битов, это, очевидно, предполагает, что ваши параметры m
& y
являются целыми числами, так как передача чисел в виде строк приведет к странным результатам.
JSFiddle: http://jsfiddle.net/TrueBlueAussie/H89X3/22/
Результаты JSPerf: http://jsperf.com/days-in-month-head-to-head/5
По какой - то причине, (m+(m>>3)&1)
является более эффективным , чем (5546>>m&1)
на почти все браузеры.
Единственное реальное соревнование за скорость - от @GitaarLab, поэтому я создал JSPerf, чтобы мы могли проверить его на: http://jsperf.com/days-in-month-head-to-head/5
Он работает на основе моего ответа о високосном году здесь: javascript, чтобы найти високосный год, этот ответ здесь Проверка високосного года с использованием побитовых операторов (удивительная скорость), а также следующей двоичной логики.
Быстрый урок в бинарных месяцах:
Если вы интерпретируете индекс желаемых месяцев (Jan = 1) в двоичном виде, вы заметите, что месяцы с 31 днем либо имеют очищенный бит 3 и бит 0, либо установлен бит 3 и бит 0 сброшены.
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
Это означает, что вы можете сдвинуть значение на 3 позиции >> 3
, XOR биты с оригиналом ^ m
и посмотреть, если результат 1
или 0
в битовой позиции 0 используется & 1
. Примечание: получается +
немного быстрее, чем XOR ( ^
) и (m >> 3) + m
дает тот же результат в бите 0.
Результаты JSPerf : http://jsperf.com/days-in-month-perf-test/6