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는 K & R C로 알려진 고대의 ANSI 이전의 방언과 역 호환됩니다. K & R C는 함수 프로토 타입이 빈 인수 목록을 가질 수 있도록합니다.
int myFunction();
/* This function accepts unspecified parameters */
ANSI C는 varargs
( ...
)에 대한 기능을 제공하고 void
빈 인수 목록을 지정합니다.
int myFunction(void);
/* This function accepts no parameters */
많은 사람들 이 함수가 인수가 0이 될 것으로 예상 할 때 unspecified
인수 목록 ( int myfunction();
)을 사용하여 실수로 함수를 선언합니다 . 함수 가 인수 를 허용 하기 때문에 이것은 기술적으로 버그 입니다. 그것들의 수
varargs
C 의 적절한 기능은 다음과 같은 형식을 취합니다.
int myFunction(int nargs, ...);
그리고 JavaScript는 실제로 이와 비슷한 것을 가지고 있습니다.
이미 스프레드 연산자를 보여 드렸습니다.
...name
그것은 매우 다재다능하고 함수의 argument-list ( "rest parameters")에서 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
스프레드 연산자를 선호합니다. 깨끗하고 자체 문서화됩니다.
for - in
와 함께 루프 를 사용하는 것은 좋지 않습니다. 속성을arguments
반복하는 루프에 '정상'을length
대신 사용해야합니다.