JavaScript/함수

[JavaScript]매개변수의 정보를 가지는 arguments 객체

DevStory 2022. 6. 27.

arguments 객체

JavaScript의 arguements 객체는 함수에서 전달된 인자 값이 배열 형태로 저장된 객체를 말합니다. 함수에 전달된 인자의 개수와 정보를 알고 싶은 경우 유용하게 사용할 수 있습니다.

 

아래 소스 코드를 실행하면 arguments 객체를 확인할 수 있으며, 함수에 인수를 전달하지 않으면 argements 객체의 값은 null입니다.

function sum(a, b) {
  return a + b;
}

console.dir(sum);

실행 결과

arguments 객체는 함수 내부에서 사용할 수 있는 지역 변수로 arguments 객체를 사용하여 함수 내에서 함수의 인자를 참조할 수 있습니다.

 

다음 예제는 sum() 함수에서 arguments 객체를 접근합니다.

function sum(a, b) {
  console.dir(arguments)
  return a + b;
}

sum(1, 2, 3, 4);

실행 결과

JavaScript의 특징으로 함수 선언문의 매개변수 개수와 함수에 전달된 매개변수의 개수가 달라도 정상적으로 실행됩니다. 위 예제에서 sum() 함수의 선언문은 두 개의 인자를 가집니다. 하지만, sum() 함수를 호출할 때 4개의 값을 전달했습니다.

 

이러한 JavaScript의 특징 때문에 런타임 시에 함수 선언문에 작성된 인자의 개수와 함수에 전달된 인수의 개수가 다른 경우 동작을 다르게 해줘야 하며, 이를 가능하게 하는 것이 바로 arguments 객체입니다.

 

다음 예제는 sum() 함수를 호출할 때 전달되는 인수의 개수가 함수 선언문에 작성된 인자의 개수보다 작은 경우입니다.

function sum(a, b) {
  console.dir(arguments[0]); // 1
  console.dir(arguments[1]); // undefined
  console.dir(arguments[2]); // undefined
}

sum(1);

arguments 객체는 배열처럼 사용할 수 있으며, 함수를 호출할 때 넘겨지지 않은 인자는 undefined로 할당됩니다.


유사 배열 객체

arguments 객체는 배열처럼 보이지만, 배열이 아닌 유사 배열 객체입니다.

 

instanceof 연산자를 사용하여 arguments 객체의 타입이 배열인지 확인하는 아래 소스코드를 실행하면 false가 출력되는 것을 확인할 수 있습니다.

function sum(a, b) {
  console.log(arguments instanceof Array);    // false
  console.log(arguments instanceof Object);   // true
  console.log([1, 2, 3, 4] instanceof Array); // true
}

sum(1, 2, 3, 4);

JavaScript는 일반 객체에 length 프로퍼티가 존재하는 경우 유사 배열 객체라고 부르는데, arguments 객체는 length가 존재하므로 유사 배열 객체입니다.

 

즉, arguments 객체는 타입이 객체임에도 불구하고 배열에 존재하는 메서드를 사용할 수 있습니다.


나머지 매개변수

arguments 객체는 ES6부터 제공하는 화살표 함수에서 동작하지 않습니다.

const sum = (a, b) => {
  console.log(arguments);
}

sum(1, 2);

에러 내용

나머지 매개변수를 사용하여 위 문제를 해결할 수 있습니다.

const sum = (...args) => {
  console.dir(args);
}

sum(1, 2);

실행 결과


정리

  • arguments 객체는 함수 내부에서 사용할 수 있으며, 인자의 정보를 가지고 있습니다.
  • arguments 객체는 유사 배열 객체로 배열처럼 동작하는 객체입니다.
  • argumetns 객체는 화살표 함수에서 사용할 수 없으며, 나머지 매개변수로 대체할 수 있습니다.
반응형

댓글