가변 인자 함수는 매개변수 개수를 확정할 수 없는 함수를 말한다.
보통 함수는 매개변수의 개수를 지정하고 그 수만큼 인수를 받는다.
function sum(x, y) {
return x + y;
}
console.log(sum()); // NaN
console.log(sum(1)); // NaN
console.log(sum(1, 2)); // 3
console.log(sum(1, 2, 3)); // 3
자바스크립트는 매개변수 개수와 인수의 개수가 일치하는지 확인하지 않기 때문에 개수를 맞추지 않아도 에러가 나지 않는다.
매개변수는 함수 내에서 undefined로 초기화된 이후 인수가 할당된다.
arguments 객체란 함수 호출 시 전달된 인수들의 정보를 담고 있는 객체다.
arguments 객체를 사용하면 가변 인자 함수를 구현할 수 있다.
function sum() {
let result = 0;
for (let i = 0; i < arguments.length; i++) {
result += arguments[i];
}
return result;
}
console.log(sum()); // 0
console.log(sum(1)); // 1
console.log(sum(1, 2)); // 3
console.log(sum(1, 2, 3)); // 6
위의 코드를 살펴보면,
Rest 파라미터 (나머지 매개변수)는 ES6에서 도입되었다.
Rest 파라미터를 사용하면 가변 인자 함수를 구현할 수 있다.
function sum(...args) {
return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum()); // 0
console.log(sum(1)); // 1
console.log(sum(1, 2)); // 3
console.log(sum(1, 2, 3)); // 6
위의 코드를 살펴보면,
arguments 객체에 비해 간편함
function sum() {
var array = Array.prototype.slice.call(arguments);
return array.reduce(function (pre, cur) {
return pre + cur;
}, 0);
}
console.log(sum(1, 2)); // 3
function sum(...args) {
return args.reduce((pre, cur) => pre + cur, 0);
}
console.log(sum(1, 2)); // 3
화살표 함수로 가변 인자 함수를 구현할 때
function foo(...rest) {
console.log(rest); // [ 1, 2, 3 ]
}
foo(1, 2, 3);
출처 : 모던 자바스크립트 Deep Dive