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

Tre*_*ham 32 javascript

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

Math.min.apply(0, x)
Run Code Online (Sandbox Code Playgroud)

在哪里x是一个数组.为什么你会这样做?行为似乎是"从数组中取出最小值x".

Tre*_*ham 33

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

http://ejohn.org/blog/fast-javascript-maxmin/

为了便于阅读,我强烈要求人们停止这样做,而是定义一个函数

function arrayMin(arr) { return Math.min.apply(Math, arr); };
Run Code Online (Sandbox Code Playgroud)

  • @GregS,它过去被称为使用各种杂物编码技术和自动代码处理工具来减少文件 - 将被发送到 - 客户机到最最小的合理,可实现的尺寸.然后它被简称为uvasctaacpttrtftwbsttcttsras.首字母缩略词的发音自然地变成了缩小词. (30认同)
  • 值得注意的是,Raphael代码中的"0"表示Math.min执行的范围.这个"应该"是Math的原因是因为这是正常调用时该方法的原生/自然范围.使用零可能相当于null,这相当于全局对象(窗口).这种方法很好,假设该方法不需要访问Math对象的内部状态,这可能是一个安全的假设,但仍然是一个假设.如果可以帮助,请不要自己使用该模式.正如你(特雷弗)所说,在那里使用数学. (12认同)
  • 对上述的更正:此处使用零不等于null.它在语义上是愚蠢的,并且导致范围是表示零的Number对象,这基本上是没有价值的.这使得字符数量保持最小,但仍然假设"min"的内部运作. (9认同)

Dav*_*son 5

原因是这样的:

  • 您的输入x是一个数组

  • 的签名Math.min()不使用数组,仅使用逗号分隔的参数

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

    • 例: Math.min.call(context, num1, num2, num3)
  • context只有当你指的事项this里面的函数,例如,你可以在阵列上调用大多数方法:Array.prototype.<method>将引用this(数组左边的“点”)的方法内。

  • Function.prototype.apply()与十分相似.call(),只是它不再使用逗号分隔的参数,而是在后面添加一个数组context

    • Function.prototype.call(context, arg1, arg2, arg3)
    • Function.prototype.apply(context, [arg1, arg2, arg3])
  • 0null你把在作为第一个参数只是一个地方移。