자바스크립트에서 함수를 만들어 사용할때 그 함수의 인자에 대한 타입은 암묵적인 약속입니다. 이 말은 “이 함수의 인자의 타입은 … 이다”라는 개념에 지나지 않다는 의미입니다. 그러한 개념에서 벗어나 보다 엄격하게 그 타입을 지키도록 하는 방어책이 필요할때 아래의 예를 참고하고자 이 글로 정리해 둡니다.
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 완벽 가이드라는 책의 코드를 조금 변형한 것입니다. 자바스크립트에 관해 좋은 책이라고 생각합니다.