На момент написания описание MDN функции Array.from
гласит:
Array.from()
имеет необязательный параметр mapFn, который позволяет выполнять функцию map() для каждого элемента создаваемого массива.Более четко,
Array.from(obj, mapFn, thisArg)
имеет тот же результат, что иArray.from(obj).map(mapFn, thisArg)
,
за исключением того, что он не создает промежуточный массив.
Однако у него не в точности такое же поведение, как показано здесь:
function mapFn(...args) {
console.log(...args);
}
let obj = { 0: "value", length: 1 };
let thisArg = { };
Array.from(obj, mapFn, thisArg);
Array.from(obj).map(mapFn, thisArg);
Array.from
не передает третий аргумент функции обратного вызова.
Это соответствует спецификации ECMAScript 2020 для Array.from
:
Звонок ( mapfn , thisarg , " rentsalue , K »).
В то время как для Array.prototype.map
спецификация имеет:
Вызов ( callbackfn , thisArg «-значение , к , O »).
Очевидно, приведенная выше цитата из MDN не совсем верна.
Вопрос
Почему такая разница? Разве не было бы разумнее, если бы функция Array.from
работала как функция map(), как указано в приведенной выше цитате из MDN?
Ммм,
thisArg
должно быть буквально значениемthis
, переданным обратному вызову. Не третий параметр функцииmap
. Это две разные вещи.Другими словами,
Array.from
не вызываетmap
, как сбивает с толку MDN, это являетсяmap
.@pilchard, а может и не быть. Массив (как показано) по крайней мере присутствует, но если передается итератор, нет возможности передать полностью материализованное представление этого итератора.
@georg Я полагаю, что вики имела в виду что-то вроде «позволяет вам выполнять операцию сопоставления», но это как бы потерялось в переводе на «позволяет вам выполнять .map()»