자바스크립트 함수 타입 검사
Javascript 2012. 3. 13. 11:21
자바스크립트는 언어 특성상 데이터 타입에 대해 까다롭지 않은 언어입니다.
죽, 타 언어와는 달리 함수에 전달되는 전달인자의 개수가 다르거나 전달인자의 타입이 다른 경우 해당하는 에러메시지
조차 없다는 말입니다.
조차 없다는 말입니다.
함수에 전달되는 전달인자를 나타내는 객체인 arguments 객체를 이용하여 아래와 같이 해당 기능을 구현할 수 있습니다.
-
function strict(types){
-
-
var args = strict.caller.arguments;
-
-
if (!types || types.constructor !== Array) return false;
-
if (typeof args !== 'object') return false;
-
-
var tlen = types.length
-
, alen = args.length
-
, k = 1;
-
-
-
if (tlen !== alen){
-
throw new Error('전달인수 갯수가 일치하지 않습니다.');
-
}
-
-
for (var i = 0; i < tlen; i++){
-
-
if (!isDataType(types[i], args[i])){
-
throw new Error('호출 함수에 가장 일치하는 오버로드된 메서드의 ' + k + '(' + types[i] + ')' + ' 번째 인수에 잘못된 인수가 있습니다.');
-
}
-
-
k++;
-
}
-
-
return this;
-
}
-
-
function isDataType(type, arg){
-
-
type = type.toLowerCase();
-
-
var types = {
-
'object': Object,
-
'array': Array,
-
'function': Function,
-
'string': String,
-
'number': Number,
-
'boolean': Boolean
-
};
-
-
if (type !== 'newobject')
-
{
-
-
if (types[type]){
-
if (arg.constructor === types[type]) return true;
-
else return false;
-
}
-
}
-
else
-
{
-
// typeof 연산자만 가지고는 new Function() 타입을 가려낼 수 없습니다.
-
if (arg.constructor !== Object && arg.constructor !== Array && typeof arg === 'object') return true;
-
else return false;
-
}
-
};
-
-
function fn(obj, obj, arr, fn, str, num, bls){
-
strict(['object', 'newobject', 'array', 'function', 'string', 'number', 'boolean']);
-
};
-
-
-
// 아래는 각각 다른 타입의 전달인자를 넣어 호출 하는 예입니다.
-
-
var a = function() { ; };
-
fn({}, new a(), [], function(){ ; }, 'str', 1, true);
-
fn({}, {}, [], function(){ ; }, 'str', 1, true);
-
fn({}, [], [], function(){ ; }, 'str', 1, true);
arguments 객체를 활용하여 위와 같은 구현은 가능하지만 모듈개발 시 잘 쓰이지 않는 것이 보통입니다.
하지만 알맞은 타입검사는 그만큼 해당 모듈의 에러를 줄여주는 역할을 합니다.