Начиная с 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
аргументами list ( int myfunction();
), когда ожидают, что функция примет нулевые аргументы. Технически это ошибка, потому что функция будет принимать аргументы. Любое их количество.
Правильная varargs
функция в C принимает форму:
int myFunction(int nargs, ...);
И в JavaScript действительно есть нечто похожее на это.
Я уже показал вам оператор спреда.
...name
Он довольно универсален и может также использоваться в списке аргументов функции («параметры покоя»), чтобы задавать переменные в хорошо документированном виде:
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
Я предпочитаю спред оператора. Это чисто и самодокументировано.
for - in
цикл сarguments
объектом -length
вместо него следует использовать «нормальный» цикл, повторяющий свойство