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