Станом на 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 назад сумісний із стародавнім діалектом до 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
Він досить універсальний, а також може бути використаний у списку аргументів функції ("параметри відпочинку") для вказівки варагів у добре задокументованому вигляді:
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
замість цього слід використовувати «нормальний» цикл для ітерації над властивістю