Rest paramter 구문은 여러 인수를 배열로 받을 때 사용한다.
function func(...args) {
console.log(...args); // 1 2 3
console.log(Array.isArray(args)); // true
}
func(1, 2, 3);
function func(a, b, ...args) {
console.log(a, b); // 1 2
console.log(...args); // 3 4 5
}
func(1, 2, 3, 4, 5);
함수의 마지막 매개변수의 앞에 ...
을 붙여 모든 나머지(rest) 인수를 배열로 대체한다. 함수의 마지막 매개변수만 rest parameter로 설정할 수 있다. 그렇지 않는다면, 에러가 발생한다.
function func(a, ...args, b) { // Uncaught SyntaxError: Rest parameter must be last formal parameter
...
}
func(1, 2, 3, 4, 5);
전개 구문과 비슷해 보이지만, 엄밀히 살펴보면 정 반대의 기능을 한다. rest parameter는 들어온 인수를 배열로 묶지만, 전개 구문은 배열에서 요소를 꺼내 확장한다.
arguments
객체는 함수에 전달된 인수의 배열 객체이다. 배열처럼 사용할 수 있을 뿐, 배열이 아니다.
function func(a, b, c) {
console.log(arguments); // [Arguments] { '0': 1, '1': 2, '2': 3 }
console.log(Array.isArray(arguments)); // false
}
func(1, 2, 3);
매개변수가 없어도 동일하다. 실제로 받기로 선언한 것보다 많은 인수를 받을 수 있으므로 가변 인수를 전달해야할 때 용이하다.
function func() {
console.log(arguments); // [Arguments] { '0': 1, '1': 2, '2': 3 }
}
func(1, 2, 3);
배열처럼 사용할 수 있는 객체이므로 length
속성이 있고 인덱스를 통해 접근할 수 있다. iterable하므로 for..of문을 사용할 수 있다. 하지만 실제 배열은 아니므로 배열 메서드는 사용할 수 없다.
function func() {
console.log(arguments[0]); // 1
console.log(arguments[1]); // 2
console.log(arguments[2]); // 3
console.log(arguments.length); // 3
for (const param of arguments) {
console.log(param); // 1\n 2\n 3\n
}
arguments.forEach(console.log); // TypeError: arguments.forEach is not a function
}
func(1, 2, 3);
배열로 변환하기 위해 다음과 같은 방법을 취할 수 있다.
let arr = Array.prototype.slice.call(arguments);
let arr = [].slice.call(arguments);
let arr = Array.from(arguments);
let arr = [...arguments];
arguments
는 모든 인수를 가지고 있다.arguments
는 객체이므로 배열 메서드를 사용할 수 없다.