본문 바로가기
Programming

[Javascript] Function arguments 속성이란?

by 개발자 염상진 2022. 5. 17.

 

 

 

Javascript Function arguments ?

 

함수 객체는 다양한 프로퍼티 값을 기본적으로 내장하고 있다. 그 중 arguments 프로퍼티는 arguments 객체를 의미한다. arguments 객체는 함수가 호출되는 경우 전달된 인수들의 정보를 담고 있다. 또한 순회 가능한 유사 배열 객체다.

 

arguments는 함수 내부에서 지역변수로 사용가능하다. Javascript Function에서는 함수가 전달받는 인수의 갯수를 정확하게 카운트 하지 않는다. 따라서 인수의 갯수와 함수호출시 매개변수의 갯수가 달라도 에러를 반환하지 않는다.

 

function mul(x, y){
    console.log(arguments);
    return x * y;
}

console.log(mul(1,2,3));
➜  Algorithm_1 node test.js
[Arguments] { '0': 1, '1': 2, '2': 3 }
2

 

 

arguments 객체는 인수를 프로퍼티 값으로 가지게 되며, 프로퍼티 키는 인수의 순서를 의미한다. arguments 객체의 callee 프로퍼티는 호출되어 arguments 객체를 생성한다. 이후 함수 자신을 가리키고 arguments 객체의 length 프로퍼티는 인수의 개수를 나타낸다.

 

arguments는 함수 선언시 생성된다

 

함수를 정의할 때 선언한 매개변수들은 함수 본체 내에서 지역변수로 사용가능하다. 함수가 호출되는 경우 함수 본체 내에서 암묵적으로 매개변수가 선언되고, undefined로 초기화 된다. 이후 전달받은 인수가 할당되는 프로세스를 가지고 있다.

 

만약 전달된 인수가 선언시의 매개변수 개수보다 작으면 나머지 인수는 undefined로 초기화 된 상태로 유지된다.

만약 전달된 인수가 매개변수보다 많으면 초과된 인수는 arguments 객체에 저장된다.

 

function mul(x, y){
    [...arguments].forEach((item)=>{
        console.log(item);
    })

}

console.log(mul(1));
console.log(mul(1,2));
console.log(mul(1,2,3));
➜  Algorithm_1 node test.js
1

1
2

1
2
3

 

 

arguments Symbol 프로퍼티

 

arguments의 Symbol 프로퍼티는 arguments를 이터러블하게 만들어 주는 프로퍼티다. Symbol.iterator를 키로 사용한 메소드를 구현하면 arguments는 이터러블이 된다.

 

위에서 살펴본 것 처럼 함수 선언시 매개변수의 개수보다 많은 인수가 전달된 경우 undefined로 초기화 된다. Symbol.iterator를 키값으로 전달하는 메소드는 next() 함수를 사용할 수 있는 이터러블이 된다.

 

function mul(...x){
    
    const iter = arguments[Symbol.iterator]();

    console.log(iter.next());
    console.log(iter.next());
    console.log(iter.next());
    console.log(iter.next());
}

console.log(mul(1));
console.log(mul(1,2));
console.log(mul(1,2,3));
console.log(mul(1,2,3,4));
console.log(mul(1,2,3,4,5));​
➜  Algorithm_1 node test.js
{ value: 1, done: false }
{ value: undefined, done: true }
{ value: undefined, done: true }
{ value: undefined, done: true }
undefined
{ value: 1, done: false }
{ value: 2, done: false }
{ value: undefined, done: true }
{ value: undefined, done: true }
undefined
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: undefined, done: true }
undefined
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }
undefined
{ value: 1, done: false }
{ value: 2, done: false }
{ value: 3, done: false }
{ value: 4, done: false }

 

 

arguments를 사용하는 이유

 

Javascript의 함수 호출 시 인수의 개수를 확인하지 않는 특성 때문에 가변 인자 함수를 구할 때 arguments 객체가 유용하게 사용된다.

 

arguments는 length 프로퍼티를 소유하는 유사 배열 객체(array-like object)다. for 문으로 순회가 가능하다. 유사배열 객체인 arguments는 엄격히 말해서 배열(Array)가 아니기 때문에 배열 내장 함수를 사용하기 위해서는 배열로 변경 후 사용해줘야 한다.

function mul(){
    let result = 1;

    for(let i=0; i<arguments.length; i++){
        result *= arguments[i];
    }

    return result;
    
    
}

console.log(mul(1));
console.log(mul(1,2));
console.log(mul(1,2,3));
console.log(mul(1,2,3,4));
console.log(mul(1,2,3,4,5));
➜  Algorithm_1 node test.js
1
2
6
24
120

 

 

arguments(유사 배열 객체) 배열로 변경하는 방법

function mul(){
    const arr = Array.prototype.slice.call(arguments);

    console.log(Array.isArray(arr));

    return arr.reduce((acc, cur)=>acc*cur, 1);
    
}
➜  Algorithm_1 node test.js
true
1
true
2
true
6
true
24
true
120

댓글