Math.min.apply(0,array) - 为什么?

时间:2010-05-19 22:53:29

标签: javascript

我只是在挖掘一些JavaScript代码(Raphaël.js)并遇到以下行(稍微翻译):

Math.min.apply(0, x)

其中x是一个数组。为什么你会这样做?行为似乎是“从数组x中获取最小值。”

4 个答案:

答案 0 :(得分:33)

当我发布自己的问题时,我意识到了答案:这个在JavaScript中获取数组x的最简洁方法。第一个论点是完全随意的;我发现0令人困惑,因为代码直观地意味着“取0和x的最小值”,这绝对不是这种情况。使用Math对象对于人类可读性更有意义,但Raphael.js作者痴迷于缩小,0缩短了三个字节。

请参阅http://ejohn.org/blog/fast-javascript-maxmin/

为了便于阅读,我强烈要求人们停止这样做,而是按照

的方式定义一个功能。
function arrayMin(arr) { return Math.min.apply(Math, arr); };

答案 1 :(得分:3)

原因是:

  • 您的输入:value是一个数组

  • x的签名不带数组,只有逗号分隔的参数

  • 如果你使用的是Math.min(),它的签名几乎相同,除了第一个参数是Function.prototype.call()上下文,是谁&#39>& #34;调用"

    • 示例:this
  • Math.min.call(context, num1, num2, num3)仅在您在函数内部引用context时很重要,例如您可以在数组上调用的大多数方法:this请参阅方法内的Array.prototype.<method>(&#39;点&#39;左侧的数组)。

  • thisFunction.prototype.apply()非常相似,只是代替使用逗号分隔的参数,它现在需要.call()之后的数组。

    • context
    • Function.prototype.call(context, arg1, arg2, arg3)
  • 您输入的Function.prototype.apply(context, [arg1, arg2, arg3])0作为第一个参数只是一个移位器。

答案 2 :(得分:1)

调用它的正确且不那么混乱的方式是: Math.min.apply(null,array)

如果参数未使用,则将其设置为null会使代码比将其设置为0或数学

更具可读性

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply

答案 3 :(得分:0)

这是一个示例,我们可以获得给定年份的MAX和MIN时区偏移量。它返回年度的两个更改以考虑DST和ST。 (即,对于所讨论的时区,ST = 300,DST = 360)。

   var arr = [];
   for (var i = 0; i < 365; i++) {
       var d = new Date();
       d.setDate(i);
       var newoffset = d.getTimezoneOffset();
       arr.push(newoffset);
   }
   var DST = Math.min.apply(null, arr);
   var nonDST = Math.max.apply(null, arr);
   tw.local.stInt = DST
   tw.local.edInt = nonDST