Почему этот фрагмент кода должен использовать Math.min.apply, а не просто Math.min - PullRequest
0 голосов
/ 27 апреля 2020

Я читал следующий сокращенный код из этого поста , который получает «минимальную» дату в списке дат:

var dates=[];
dates.push(new Date("2011/06/25"))
dates.push(new Date("2011/06/26"))
dates.push(new Date("2011/06/27"))
var minDate=new Date(Math.min.apply(null,dates));

Может ли кто-то объяснить, почему нам нужно использовать .apply здесь?

Я понимаю, что .apply используется для выполнения функции с предоставленным значением this, но я не понимаю, почему код требует, чтобы функция min была вызывается с this=null и почему код не работает при замене: Math.min.apply(null, dates) на Math.min(dates)

Ответы [ 2 ]

2 голосов
/ 27 апреля 2020

Это потому, что метод Function.prototype.apply() имеет два параметра. Первый - это недавно присвоенное значение this, а второй - массив аргументов, которые будут переданы вызываемой функции.

Ваш пример не делает ничего особенного с первым параметром, но он делает со вторым.

Math.min() принимает бесконечное количество аргументов. Ваши примеры передают массив дат в качестве аргумента и распространяют элементы в массиве в качестве аргументов. В настоящее время вы можете сделать что-то вроде этого, с синтаксисом распространения.

var minDate = new Date(Math.min(...dates));
1 голос
/ 27 апреля 2020

Math.min требует одно или несколько значений, переданных в качестве параметров. Поскольку строки даты были помещены в массив, при передаче массива в качестве значения будет использоваться только массив, а не даты.

Использование apply передаст элементы массива в качестве аргументов, это фактически аналогично использованию синтаксиса расширения:

Math.min(...dates);

Поскольку первый аргумент, переданный apply - это значение, используемое для this , и Math.apply не имеет значения, что такое this , null передается (вы можете передать любое значение).

Этот метод был распространен до введения синтаксиса расширения в ECMAScript 2016 (ed 7).

...