我只是在挖掘一些JavaScript代码(Raphaël.js)并遇到以下行(稍微翻译):
Math.min.apply(0, x)
其中x
是一个数组。为什么你会这样做?行为似乎是“从数组x
中获取最小值。”
答案 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;左侧的数组)。
this
与Function.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