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

新手上路,请多包涵

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

 Math.min.apply(0, x)

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

原文由 Trevor Burnham 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 352
2 个回答

我在发布自己的问题时意识到了答案:这 在 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); };

原文由 Trevor Burnham 发布,翻译遵循 CC BY-SA 2.5 许可协议

原因是这样的:

  • 您的输入 x 是一个数组

  • Math.min() 的签名不接受数组,只接受逗号分隔的参数

  • 如果您使用的是 Function.prototype.call() 它将具有几乎相同的签名,除了第一个参数是 this 上下文, 谁在“呼叫”

    • 示例: Math.min.call(context, num1, num2, num3)
  • The context only matters when you refer to this inside the function, eg most methods you can call on an array: Array.prototype.<method> would refer to this (“点”左侧的数组)在方法内。

  • Function.prototype.apply().call() 非常相似,只是它不再采用逗号分隔的参数,而是在 context 之后采用一个数组

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

原文由 David Rosson 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题