Подтвердить что ты не робот

Math.min.apply(0, array) - почему?

Я просто копал код JavaScript (Raphaël.js) и наткнулся на следующую строку (немного перевел):

Math.min.apply(0, x)

где x - массив. Почему бы вам это сделать? Поведение, похоже, "берет min из массива x".

4b9b3361

Ответ 1

Я понял ответ, когда я отправлял свой собственный вопрос: это самый краткий способ переноса 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); };

Ответ 2

Причина такова:

  • Ваш вход 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, который вы вставляете в качестве первого аргумента, - это просто переключение места.

Ответ 4

Вот пример, где мы можем получить смещения временной шкалы 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