깐깐한 아줌마 같은 자바와 달리, 자바스크립트에서는 함수를 호출할 때 함수 형식에 맟춰 인자를 넘기지 않아도 에러가 발생하지 않는다.
- 정의된 인자보다 적게 함수를 호출했을 경우, 넘겨주지 않은 인자에는 특별한 값 undefined가 할당된다.
- 반대로 정의된 인자보다 많게 함수를 호출했을 경우, 에러가 발생하지 않고 초과된 인수는 무시된다.
function func(arg1, arg2) {
console.log(arg1, arg2);
}
func(); // undefined undefined
func(1); // 1 undefined
func(1, 2); // 1 2
func(1, 2, 3); // 1 2
이러한 특성 때문에 함수 코드를 작성할 때, 런타임 시 호출된 인자의 개수를 확인하고 이에 따라 동작을 다르게 해줄 수 있다.
이를 가능하게 하는게 바로 arguments 객체
다.
1. arguments
자바스크립트에서는 함수를 호출할 때 인수들과 함께 암묵적으로 arguments 객체가 함수 내부로 전달된다.
arguments 객체는 함수를 호출할 때 넘긴 인자들이 배열 형태로 저장된 객체를 의미한다.
특이한 점은 실재 배열이 아닌 마치 배열 형태처럼 숫자로 인덱싱된 프로퍼티가 있는 객체다.
이러한 객체를 배열과 유사하다 하여 앞으로 유사 배열 객체
라고 부르겠다.
// add() 함수
function add(x, y) {
// arguments 객체 출력
console.dir(arguments);
return x + y;
}
console.log(add(1)); // NaN
console.log(add(1, 2)); // 3
console.log(add(1, 2, 3)); // 3
arguments 객체는 세 부분으로 구성되어 있다.
- 함수를 호출할 때 넘겨진 인자(배열 형태): 첫 번째 인자는 0, ... n-1번 인덱스
- length 프로퍼티: 호출할 때 넘겨진 인자의 개수
- callee 프로퍼티: 현재 실행 중인 함수의 참조값
arguments 유사 배열 객체로써 배열과 유사하게 동작하지만, 배열은 아니므로 배열 메서드를 사용하면 에러가 발생한다.
2. arguments 객체의 활용
매개변수 개수가 정확하게 정해지지 않은 함수를 구현하거나, 전달된 인자의 개수에 따라 서로 다른 처리를 해줘야하는 함수를 구현할 수 있다.
function sum() {
var result = 0;
for(var i = 0; i < arguments.length; ++i) {
result += arguments[i];
}
return result;
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5, 6, 7)); // 28
by 소년코딩
추천은 글쓴이에게 큰 도움이 됩니다.
악플보다 무서운 무플, 댓글은 블로그 운영에 큰 힘이됩니다.