Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Math.min.apply(0,数组)-为什么?_Javascript - Fatal编程技术网

Javascript Math.min.apply(0,数组)-为什么?

Javascript Math.min.apply(0,数组)-为什么?,javascript,Javascript,我刚刚翻阅了一些JavaScript代码(Raphaël.js),遇到了以下几行(稍微翻译一下): 其中x是一个数组。你到底为什么要这样做?行为似乎是“从数组中取最小值x”我在发布自己的问题时意识到了答案:这是在JavaScript中取数组x最小值最简洁的方法。第一个论点是完全武断的;我发现0令人困惑,因为代码直观地表示“取0和x的最小值”,这绝对不是事实。使用Math对象对于人类可读性来说更有意义,但是Raphael.js的作者们热衷于缩小,0要短三个字节 看 为了可读性,我强烈建议人们停止这

我刚刚翻阅了一些JavaScript代码(Raphaël.js),遇到了以下几行(稍微翻译一下):


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

我在发布自己的问题时意识到了答案:这是在JavaScript中取数组
x
最小值最简洁的方法。第一个论点是完全武断的;我发现0令人困惑,因为代码直观地表示“取0和x的最小值”,这绝对不是事实。使用Math对象对于人类可读性来说更有意义,但是Raphael.js的作者们热衷于缩小,0要短三个字节

为了可读性,我强烈建议人们停止这样做,而是按照

function arrayMin(arr) { return Math.min.apply(Math, arr); };

这里是一个例子,我们可以得到一个时区给定年份的最大和最小时区偏移量。它返回该年的两个变化,以说明DST和ST(即,对于所讨论的时区,ST=300和DST=360)

var arr=[];
对于(变量i=0;i<365;i++){
var d=新日期();
d、 设定日期(i);
var newoffset=d.getTimezoneOffset();
arr.push(新偏移量);
}
var DST=Math.min.apply(null,arr);
var nonDST=Math.max.apply(null,arr);
tw.local.stInt=DST
tw.local.edInt=nonDST
原因如下:

  • 您的输入
    x
    是一个数组

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

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

    • 示例:
      Math.min.call(上下文,num1,num2,num3)
  • 上下文
    仅当您在函数中引用
    this
    时才起作用,例如,您可以在数组中调用的大多数方法:
    数组。原型。
    将在方法中引用
    this
    (“点”左侧的数组)

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

    • Function.prototype.call(上下文,arg1,arg2,arg3)
    • Function.prototype.apply(上下文[arg1、arg2、arg3])
  • 作为第一个参数输入的
    0
    null
    只是一个移位器


    • 正确且不太容易混淆的称呼方式是: Math.min.apply(null,数组)

      若参数未使用,将其设置为null比将其设置为0或Math更易于阅读


      值得注意的是,Raphael代码中的“0”表示Math.min执行的范围。这个“应该”是Math的原因是,在正常调用时,它是该方法的本机/自然范围。使用零可能相当于null,这相当于全局对象(窗口)。假设该方法不需要访问Math对象的内部状态(这可能是一个安全的假设,但仍然是一个假设),那么它就可以正常工作。如果你能帮助的话,不要自己使用这种模式。正如你(特雷弗)注意到的,在这里使用数学。对上面的更正:在这里使用零并不等于零。它在语义上是愚蠢的,导致作用域是一个表示零的数字对象,这基本上是毫无价值的。这使字符数保持在最小值,但仍然对“min”的内部工作进行假设。缩小?这真的是一个词吗?:)@GregS,它曾被称为使用各种各样的编码技术和自动代码处理工具,将发送给客户的文件减少到合理可达到的最小大小。然后它被简称为uvasctaacpttrtftwbsttcttsras。首字母缩略词的发音自然演变成缩略词。谢谢吉诃多,谢谢大家的笑声。我想我现在更聪明了。Math.min.apply(这个,x)也可以。有人能告诉我调用Math.min.apply(null,arr)和Math.min.apply(Math,arr)的区别吗。空调用上下文如何与apply一起工作?min方法的本机上下文是Math对象,使用Math作为apply方法的第一个参数更有意义。您能详细解释第一个参数吗?我尝试:var数字=[5,6,7,2,3];var max1=Math.max.apply(4,数字);var max2=Math.max.apply(9,数字);var max3=Math.max.apply(null,数字);但我看不到max1,max2,max3的不同结果。那么,我该如何用我的例子得到不同的结果呢?
      function arrayMin(arr) { return Math.min.apply(Math, arr); };
      
         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