[JavaScript] 함수 인자의 타입 검사

자바스크립트에서 함수를 만들어 사용할때 그 함수의 인자에 대한 타입은 암묵적인 약속입니다. 이 말은 “이 함수의 인자의 타입은 … 이다”라는 개념에 지나지 않다는 의미입니다. 그러한 개념에서 벗어나 보다 엄격하게 그 타입을 지키도록 하는 방어책이 필요할때 아래의 예를 참고하고자 이 글로 정리해 둡니다.

function sum(a /* Array */)
{
    var isArray = (a instanceof Array);
    var isLikeArray = (a && typeof a == "object" && "length" in a);
  
    if(isArray || isLikeArray)
    {
        var total = 0;
    
        for(var i=0; i        {
            var element = a[i];
            if(!element) continue;
            if(typeof element == "number") 
                total += element;
            else 
                throw new Error("원소는 숫자여야 함");
        }

        return total;
    }
  
    throw new Error("인자는 배열이어야 함");
 }

var a = [1,2,3,4,5];
try 
{
    document.write(sum(a));
} 
catch(e)
{
    document.write(e.message);
}

3번 코드가 전달 받은 인자의 타입이 배열인지를 확인하는 것이고 4번은 배열과 비슷한 객체인지, 즉 length 프로퍼티를 제공하는지를 확인하는 코드입니다. 14번 코드는 배열의 원소가 숫자인지를 확인하는 코드입니다.

이 코드는 인사이트의 JavaScript 완벽 가이드라는 책의 코드를 조금 변형한 것입니다. 자바스크립트에 관해 좋은 책이라고 생각합니다.

[JavaScript] 가변 길이 인자를 갖는 함수

자바스크립트는 긍정적으로 본다면 매우 유연한 언어입니다. 이러한 유연한 부분 중 함수에서 가변 길이 인자에 대한 예를 정리해 봅니다. 함수에서 가변 인자를 사용하기 위해 arguments라는 식별자를 사용합니다.

function func(/*a, b*/)
{
    if(arguments.length != 2)
    {
        throw new Error("인자가 옳바르지 않음.");
    }

    var arg0 = arguments[0];
    var arg1 = arguments[1];

    document.write(arg0 + ", " + arg1);
}

try 
{
    func(1,2);
} 
    catch(e)
{
    document.write("catch error");
}

위의 코드에서 정의한 함수 func는 2개의 인자를 받도록 되어 있습니다. 2개의 인자인지 arguments의 length 속성을 사용합니다. 각각의 인자는 마치 배열처럼(배열은 아님) 0부터 시작하는 인덱스 값을 사용합니다.

끝으로 arguments는 callee라는 프로퍼티를 통해 자신에 대한 함수 자체를 참조할 수 있도록 합니다.