Начиная с ES2015, существует два метода.
Этот объект встроен в функции и, соответственно, относится к аргументам функции. Технически, однако, это не массив, поэтому типичные операции над массивами не будут работать с ним. Предлагаемый метод заключается в использовании Array.from
или оператора распространения для создания массива из него.
Я видел другие упоминания ответов, используя slice
. Не делай этого. Это предотвращает оптимизацию (источник: MDN ).
Array.from(arguments)
[...arguments]
Однако я бы сказал, что arguments
проблематично, потому что он скрывает то, что функция принимает в качестве ввода. Функция arguments
обычно записывается так:
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
Иногда заголовок функции пишется следующим образом для документирования аргументов в стиле C:
function mean(/* ... */){ ... }
Но это редко.
Что касается того, почему это проблематично, возьмите, например, C. C обратно совместим с древним пре-ANSI диалектом языка, известного как K & R C. K & R C позволяет прототипам функций иметь пустой список аргументов.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C предоставляет возможность для varargs
(...
) и void
для указания пустого списка аргументов.
int myFunction(void);
/* This function accepts no parameters */
Многие люди непреднамеренно объявляют функции со списком аргументов unspecified
(int myfunction();
), когда ожидают, что функция примет нулевые аргументы. Технически это ошибка, потому что функция будет принимать аргументы. Любое их количество.
Правильная varargs
функция в C принимает форму:
int myFunction(int nargs, ...);
И в JavaScript действительно есть нечто похожее на это.
Я уже показал вам оператор спреда.
...name
Он довольно универсален и может также использоваться в списке аргументов функции («параметры покоя»), чтобы задавать varargs хорошо документированным образом:
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
Или как лямбда-выражение:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
Я предпочитаю спред оператора. Он чистый и самодокументирующийся.