Станом на 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замість цього слід використовувати «нормальний» цикл для ітерації над властивістю