: 매개변수 이름 앞에 ...
을 붙여서 정의한 매개변수
function func(...rest) {
console.log(rest); // [ 1, 2, 3]
console.log(Array.isArray(rest)); // true
}
func(1, 2, 3);
function func(arg1, arg2, ...args) {
return [arg1, arg2, args];
}
func(1); // [1, undefined, []]
func(1, 2, 3); // [1, 2, 3]
func(1, 2, 3, 4, 5); // [1, 2, [3, 4, 5]]
length
프로퍼티에 영향을 주지 않는다.함수 객체의 length
프로퍼티 : 함수 정의 시 선언한 매개변수 개수를 나타낸다.
function func1(...rest) {}
func1.length; // 0
function func2(arg1, arg2, ...rest) {}
func2.length; // 2
arguments 객체
: 함수 호출 시, 함수에 전달되는 전달인자들이 배열 형태로 저장된 객체
ES5에서는 전달인자가 몇 개가 전달될지 확실하지 않은 상황에서 arguments 객체를 통해 인수를 확인했다. 하지만 arguments 객체는 유사 배열 객체이므로
Array.from()
등의 메소드를 이용해 배열로 변환하여 사용해야 했다.
Array.from(), arguments 객체
ES6에서는 rest parameter를 사용하여 전달인자가 몇 개이든 배열로 전달받을 수 있으며, 유사 배열 객체인 arguments 객체를 배열로 변환하는 번거로움을 피할 수 있게 되었다.
function sum(...rest) {
let result = 0;
for(let i = 0; i < rest.length; i++) { // 전달 받은 전달인자의 수만큼 반복문을 반복한다.
result = result + rest[i];
}
return result;
}
sum(1, 2, 3); // 6
sum(1, 2, 3, 4, 5); // 15
화살표 함수에는 함수 객체의 arguments 프로퍼티가 없다.
따라서 화살표 함수로 가변 인자 함수를 구현해야 할 때는 반드시 rest parameter를 사용해야 한다.
const normalFunc = function () {}; // 일반 함수
normalFunc.hasOwnProperty('arguments'); // true
>
const arrowFunc = () => {}; // 화살표 함수
arrowFunc.hasOwnProperty('arguments'); // false
이 글은 아래 링크를 참고하여 작성한 글입니다.
https://poiemaweb.com/es6-extended-parameter-handling