2

我目前正在使用以下基于网络示例的函数,它每秒调用一次以通过视频流显示当前进度。

我可以做些什么来提高效率吗?

function secondstominutes(secs){

var s;
if(secs > 60){
  var min = Math.floor(secs / 60);
  s = min < 10 ? "0" : "";
  s += min +":";
  secs = secs - min * 60;
} else {
  s = "00:";
}

if(secs < 10){
  s+= "0" + Math.floor(secs);
} else {
  s += Math.floor(secs);
}
return s;
}
4

3 回答 3

4
function secondstominutes(secs)
{
   var mins = Math.floor(secs / 60);
   secs = secs % 60;

   return (mins < 10 ? "0" + mins : mins) 
          + ":"
          + (secs < 10 ? "0" + secs : secs);
}
于 2009-01-28T20:21:18.250 回答
1

是的,它可以更简单一些,并且使用更少的 Math.floor、局部变量等。这是我的提议:

function secondstominutes(secs)
{
   return (Math.floor(secs/60))+":"+secs%60;
}

这将给出如下结果:

0:1 1 秒 0:10 10 秒 1:1 61 秒

等等

如果你想要空格等,可以这样做:

function formatZero(number)
{
   return (number>9) ? number : "0"+number;
}

function secondstominutes(secs)
{
   return formatZero((Math.floor(secs/60)))+":"+formatZero(secs%60);
}

而这个是用于强迫性的单线功能 ppls ;)

function secondstominutes(secs)
{
   return ((arguments[1]=(Math.floor(secs/60)))<10?"0":"")+arguments[1]+":"+((arguments[2]=secs%60)<10?"0":"") + arguments[2];
}
于 2009-01-28T20:19:41.017 回答
1

bobwienholt的版本紧凑、快速、清晰,与我实现它的方式非常相似。为了好玩,我对一些不同的解决方案进行了一些分析,我发现这有点快,但是它不是很清楚,并且在语句中做了一个半隐藏的赋值:

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 )

这是做(secs = secs % 60)的简写形式。它将secs的值除以 60 并分配secs提醒(例如 61 % 60 = 1)。通过分析,我发现将计算放在 return 语句中而不是放在一行中要快一些。

(m < 10 ? "0" + m : m)

这将计算第一条语句m < 10,如果为真,则执行第二条语句"0" + m否则执行第三条:m。英文:如果m小于 10,则在开头添加一个零,否则按原样返回该值。

于 2009-01-28T22:39:58.267 回答