Я просто копал код JavaScript (Raphaël.js) и наткнулся на следующую строку (немного перевел):
Math.min.apply(0, x)
где x
- массив. Почему бы вам это сделать? Поведение, похоже, "берет min из массива x
".
Я просто копал код JavaScript (Raphaël.js) и наткнулся на следующую строку (немного перевел):
Math.min.apply(0, x)
где x
- массив. Почему бы вам это сделать? Поведение, похоже, "берет min из массива x
".
Я понял ответ, когда я отправлял свой собственный вопрос: это самый краткий способ переноса min массива x
в JavaScript. Первый аргумент полностью произволен; Я считаю, что 0 запутывает, потому что код интуитивно означает "Возьмите минимум 0 и x", что абсолютно не так. Использование объекта Math имеет больше смысла для удобочитаемости человека, но авторы Raphael.js одержимы минимизацией, а 0 - на три байта короче.
См. http://ejohn.org/blog/fast-javascript-maxmin/
Для удобства чтения я настоятельно призываю людей прекратить это делать и вместо этого определить функцию по строкам
function arrayMin(arr) { return Math.min.apply(Math, arr); };
Причина такова:
Ваш вход 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])
0
или null
, который вы вставляете в качестве первого аргумента, - это просто переключение места.
Правильный и менее запутанный способ назвать это: Math.min.apply(null, array)
Если параметр не используется, он устанавливает значение null, что делает код более читаемым, чем установка его в 0 или Math
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
Вот пример, где мы можем получить смещения временной шкалы 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