bobwienholt s - компактная, быстрая и понятная версия, и она очень похожа на ту, как я ее реализовал. Для забавы я провел профилирование нескольких различных решений и обнаружил, что это немного быстрее, однако это не так понятно, и я выполняю назначение, частично скрытое в утверждении:
function secondstominutes(secs)
{
var m = (secs / 60) | 0;
return (m < 10 ? "0" + m : m)
+ ":"
+ ( ( secs %= 60 ) < 10 ? "0" + secs : secs);
}
Пояснение:
var m = (secs / 60) | 0;
Разделите секунды на 60 и двоичное «ИЛИ» результат с 0. Бинарное «ИЛИ» преобразует значение в целое число, и, с помощью 0, целая часть результата возвращается без изменения. Это быстрее, чем вызов Math.floor () , но менее понятно. Поскольку он преобразуется в целое число, вы ограничиваете продолжительность любого фильма до 2147483647 минут ≈ 35791394 часов ≈ 1491308 дней ≈ 4085 лет.
( secs %= 60 )
Это краткая форма выполнения (сек = сек% 60) . Он делит значение с на 60 и присваивает с напоминание (например, 61% 60 = 1). По профилированию я обнаружил, что было немного быстрее поместить это вычисление в оператор return, а не в собственную строку.
(m < 10 ? "0" + m : m)
Это вычисляет первый оператор m <10 </em>, и если это правда, выполняется второй оператор "0" + m , в противном случае третий: m . На английском языке: если m меньше 10, то в начале добавляется ноль, иначе значение возвращается как есть.