JavaScript의 typeof
는 간단한 타입 검사를 위한 도구로 좋지만, 보다 복잡한 객체 타입을 정확하게 판별하기에는 한계가 있습니다. 다행히, 표준 라이브러리 객체들의 타입을 정확하게 확인하는 몇 가지 방법이 있습니다.
instanceof
연산자: instanceof
는 특정 객체가 특정 생성자로부터 생성되었는지 확인하는데 사용됩니다. 예를 들어, formdata instanceof FormData
라는 코드는 formdata
가 FormData
생성자로 생성되었는지 확인하고 이에 따라 true
또는 false
를 반환합니다. 하지만 이 방법은 프로토타입 체인을 기반으로 하기 때문에, 프로토타입 체인이 수정되었거나 다른 프레임에서 생성된 객체에 대해서는 정확한 결과를 보장하지 못합니다.
Object.prototype.toString.call()
: 이 방법은 표준 빌트인 객체의 타입을 정확하게 확인하는 가장 안전한 방법입니다. Object.prototype.toString.call(formdata)
를 실행하면 "[object FormData]"
와 같은 문자열을 반환합니다. 이를 통해 FormData
타입을 확인할 수 있습니다. 이 방법은 다른 프레임에서 생성된 객체에 대해서도 정확한 결과를 반환합니다.
이런 방법을 활용해, 리터럴 오브젝트와 FormData
를 구분하는 함수를 작성할 수 있습니다. 예를 들면, 다음과 같이 작성할 수 있을 것입니다.
function getType(obj) {
var toString = Object.prototype.toString.call(obj);
if (toString === "[object Object]") {
return "Literal Object";
} else if (toString === "[object FormData]") {
return "FormData";
} else {
return "Unknown";
}
}
var myObj = {}; // 리터럴 오브젝트
var myFormData = new FormData(); // FormData 오브젝트
console.log(getType(myObj)); // 출력: Literal Object
console.log(getType(myFormData)); // 출력: FormData
이 함수는 obj
에 전달된 오브젝트의 타입을 판별하고, 그 결과를 문자열로 반환합니다.