arguments와 rest

jh·2024년 4월 1일

두개 모두 함수의 인자를 가변적으로 받고 싶을 경우에 사용되는 방법이다

Rest 파라미터

  • rest의 경우 ES6의 spread 문법을 사용한 것이다
  • rest 파라미터는 함수에 전달된 인수들을 배열로 전달받는다
function foo(...rest){
    console.log(rest)
    
}
foo() // []
foo(1,2) // [1,2]
foo({a:1,b:2}) // [{a:1,b:2}]
  • rest라는 명칭처럼, 항상 마지막 파라미터여야 한다
function foo(...rest,a,b) // Error
  • rest 라는 명칭을 사용해야 하는 것이 아니라, 아무거나 가능하다
function foo(a,b,...rast)
  • rest 파라미터는 함수 정의 시 선언한 매개변수 개수를 나타내는 함수 객체의 length 프로퍼티에 영향을 주지 않는다.

일단 함수.length 는 함수에 정의된 파라미터의 개수를 출력해주는데

function foo(a,b){
    console.log(foo.length) //2
}

이거에 영향을 주지 않는다는 의미이다

function foo(a,b,...rest){
    console.log(foo.length) //2
}

argument와의 차이점

  • 일단 argument는 ES5에서 나왔고, rest는 ES6에서 등장했다

ES5에서는 인자의 개수를 사전에 알 수 없는 가변 인자 함수의 경우, arguments 객체를 통해 인수를 확인한다

var foo = function () {
  console.log(arguments);
};

foo(1, 2); // { '0': 1, '1': 2 }
  • 일단 arguments는 객체이다(유사 배열)

    Array 형태란 arguments가 length 속성과 더불어 0부터 인덱스 된 다른 속성을 가지고 있지만, Array의 forEach, map과 같은 내장 메서드를 가지고 있지 않다는 뜻입니다.

  • 배열처럼 사용하기 위해서는 Array.from 같이 배열로 변환하는 작업이 필요한데, 이것도 ES6에서 나왔다

그래서 이전에는

const array = Array.prototype.slice.call(arguments);

이런식으로 사용이 되었다

화살표 함수

화살표 함수에서는 arguments 사용이 불가능해서, 무조건 rest parameter를 사용해야 한다

결론

  • 두개는 거의 비슷한 역할을 한다
  • arguments가 먼저 나왔고, 이를 보완하는 방법으로 rest parameter가 나왔다 라고 생각하면 될 것 같다

0개의 댓글