본문 바로가기
JavaScript

Rest 파라미터

by oncerun 2022. 3. 7.
반응형

 

 

Rest 파라미터는 매개변수 이름 앞에 세 개의 점... 을 붙여서 정의한 매개변수를 의미한다.

Rest 파라미터는 함수에 전달된 인수들의 목록을 배열로 전달받는다. 

 

일반 함수와 메서드에는 유사배 열인 arguments 바인딩이 존재하지만 화살표 함수는 함수 자체의 arguments 바인딩을 갖지 않기 때문에 화살표 함수에서의 arguments를 참조할 시 상위 스코프의 arguments를 참조한다.

 

function foo(...rest){
	console.log(rest);  // [1,2,3,4,5]
}

foo(1,2,3,4,5);

 

일반 매개변수와 Rest 파라미터는 함께 사용할 수 있다. 이때 함수에 전달된 인수들은 매개변수와 Rest파라미터에 순차적으로 할당된다.

function foo(first, ...rest){
	console.log(first) //1
	console.log(rest);  // [2,3,4,5]
}

foo(1,2,3,4,5);

 

 

Rest  파라미터는 이름 그대로 먼저 선언된 매개변수에 할당된 인수를 제외한 나머지 인수들로 구성된 배열이 할당된다. 따라서 Rest 파라미터는 반드시 마지막 파라미터이어야 한다. 또한 단 하나만 선언할 수 있다.

 

이 Rest 파라미터는 함수 정의 시 선언한 매개변수 개수를 나타내는 함수 객체의 length 프로퍼티에 영향을 주지 않는다.

 

나는 ES5환경에서 개발을 할때 가변 인자를 받는 함수를 정의하는 경우에 arguments 객체를 활용하여 인자를 전달받아 사용했다. 이 argumetns 객체는 함수 호출 시 전달된 인수들의 정보를 담고 있는 순회 가능한 유사 배열 객체 (array-like ojbect)이며, 함수 내부에서 지역 변수처럼 사용할 수 있다.

 

function variable(){
	console.log(arguments);  // {length :2, '0' : 1, '1' : 2}
}	
console.log(variable(1,2));

 

다만 arguments 객체는 유사 배열 객체이므로 배열 메서드를 사용하지 못한다. 만약 배열 메서드를 사용하려면

Function.prototype.call 이나 Function.prototype.apply 메서드를 사용해 arguments 객체를 배열로 변환해야 한다.

 

function argumentsConvertToArr(){
	
  var array = Array.prototype.slice.call(arguments);
    
  ....	
}

console.log(argumentsConvertToArr(,1,2,3,4,5));

 

 

함수를 호출할 때 매개변수의 개수만큼 인수를 전달하는 것이 바람직하지만 그렇지 않은 경우에도 에러가 발생하지 않는다. 이는 자바스크립트 엔진이 매개변수의 개수와 인수의 개수를 체크하지 않기 때문이다.

인수가 전달되지 않은 매개변수의 값은 undefined이다.

 

즉 우리는 방어 코드가 필요하다.

 

function sum(x, y){

    x = x || 0;
    y = y || 0;
    
    return x + y;
}

 

ES6에 도입된 매개변수 기본값을 사용하면 함수 내에서 수행하던 인수 체크 및 초기화를 간소화할 수 있다.

 

function sum(x = 0, y = 0) {
  return x + y;
}

매개변수 기본값은 매개변수에 인수를 전달하지 않는 경우와 undefined를 전달한 경우에만 유효하다.

 

 

반응형

'JavaScript' 카테고리의 다른 글

구조 분해 할당  (0) 2022.03.09
스프레드 문법  (0) 2022.03.09
ES6 함수  (0) 2022.03.05
클래스 (2)  (0) 2022.03.03
Property Attribute  (0) 2022.03.03

댓글