redgoose(붉은거위)

함수의 전달인자

Nest
Development
Category
Javascript
Hit
482
Star
0

개요

  • 함수는 임의 개수의 전달인자와 함께 호출될 수 있다.
  • 함수는 자신이 받기를 기대하는 전달인자의 데이터 타입을 미리 선언하는 것이 불가능하다.
  • 모든 함수에는 어떠한 데이터 타입의 값이라도 전달할 수 있다.

생략 가능한 전달인자

함수가 정의 당시에 선언된 전달인자의 개수보다 적은 수의 전달인자와 함께 호출되면 남은 전달인자들은 undefined가 된다.

만약 생략되는 전달인자에 기본값을 할당하려면...

function copyPropertyNameToArray(o, /* optional */ a) {
  if (!a) a = []; // a가 정의되지 않았거나 null이라면 빈 배열을 사용한다.
  for (var property in o) a.push(property);
  return a;
}

생략 가능한 전달인자를 사용하여 함수를 작성할 때는 생략 가능한 것들은 함수 전달인자 목록의 끝에 위치하게 하여, 호출할 때 임의로 생략이 가능하게 해야한다.

가변 길이 전달인자 목록: 전달인자 객체

함수에서 매개변수를 미리 지정하지 않고도 arguments[x]로 전달인자를 접근할 수 있다.

[x]는 전달인자의 순서가 된다. 그리고 배열처럼 전달인자의 수를 명시하는 length프로퍼티를 사용할 수 있다.

함수가 올바른 개수의 전달인자들과 함께 호출되었는지 검사하는 함수

function f(x, y, z)
{
  if (arguments.length != 3) {
    throw new Error("현재 f함수의 전달인자의 개수는 " + arguments.length + "개이다. 3개가 되어야 한다.");
  }
}
f(1, 2, 3);

arguments 객체는 임의 개수의 전달인자와도 작동할 수 있게 만들 수 있다.

아래의 예제는 임의 개수의 전달인자를 건네받아서 가장 큰 값의 전달인자를 반환하는 함수이다.
아래의 예제에서 중요한점은 max함수의 전달인자 목록이 비어있다는것이다. 전달인자가 없어도 arguments객체 대신 사용할 수 있다는 것이다.

function max(/* ... */)
{
  for (var i = 0; i < arguments.length; i++) {
    if (arguments[i] > m) {
      m = arguments[i];
    }
    return m;
}
var largest = max(1, 10, 3, 5 100, 35, 346, 334);

arguments 객체는 한가지 특성이 있다. 그것은 함수 전달인자가 지정되어있는 상태에서 arguments로 사용하여 값을 변경하면 함수전달인자의 값도 같이 변하게 된다.

함수전달인자 = arguments[]가 된다.

function f(x) {
  print(x); // x의 값을 출력한다.
  arguments[0] = null; 함수전달인자의 첫번째 값을 null로 바꾼다.
  print(x); // null로 출력된다.
}

객체 프로퍼티를 전달인자로 사용하기

함수의 전달인자의 개수가 많을경우 순서를 기억하기 힘들경우에 이름과 값을 쌍으로 전달하는 방식으로 전달하는 것이좋다.

전달인자 데이터 타입

  • 자바스크립트 데이터 타입 제약이 느슨하기 때문에 함수에서 전달인자를 받을 때 데이터타입을 검사하지 않는다.
  • 함수가 임의 개수의 전달인자를 받는다면 말줄임표 기호(...)를 주석으로 사용할 수 있다. function max(x, y, /* number... */) { /* code */ }
  • 일회용 함수를 작성할것이 아니라면 전달인자 데이터타입을 검사하는 코드를 추가하는것 좋다.
  • 아래의 링크는 데이터타입을 검사하는 코드인데, 데이터 타입을 검사하고 모든 데이터를 숫자로 바꿔서 전달인자로 받은 모든 숫자의 합을 반환한다.
  • flexisum함수 예제코드 : s_42_1.zip

함수 전달인자에서 사용하는 if문 팁

if문 문장의 길이를 줄이려면 if문 대신에 || 연산자를 이용하여 길이를 간소화할 수 있다.

if (!a) { a = []; }
a = a || [];

|| 연산자는 좌측에 위치한 값이 true거나 true로 변환되는 값이라면 이 값을 반환하며, 그렇지 않다면 우측에 위치한 값을 반환한다.
상단의 예에서 a가 null이 아니라면 빈 배열을 생성하여 반환한다. (a = []가 된다는 뜻.)