Rest parameter vs. arguments

Park, Jinyong·2020년 4월 28일
1

Small, but Valuable.

목록 보기
14/19

Rest Parameter - MDN Document
arguments - MDN Document

Rest Parameter

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

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];

Rest parameter와 arguments의 차이

  • rest parameter는 마지막 매개변수에만 위치하여 마지막으로 들어온 인수만을 포함하지만, arguments는 모든 인수를 가지고 있다.
  • rest parameter는 배열로써 사용할 수 있지만, arguments는 객체이므로 배열 메서드를 사용할 수 없다.

0개의 댓글