typeof가 'object'인 값에는 [[Class]]라는 내부 프로퍼티가 추가로 붙는다.
이것으로 typeof로 명확히 그 타입을 알 수 없는 Array 라던가 null, undefined 등과 같은 값의 본연의 타입을 알아낼 수 있다.
Object.prototype.toString.call( [1,2,3] ); // [object Array]
Object.prototype.toString.call( /regex-literal/i ); // [object RegExp]
null, undefined와 같은 원시값에도 적용될까?
Object.prototype.toString.call( null ); // [object Null]
Object.prototype.toString.call( undefined ); // [object Undefined]
그밖에 문자열, 숫자, 블리언 등도 마찬가지로 확인할 수 있다.
Object.prototype.toString.call( "abc" ); // [object String]
Object.prototype.toString.call( 42 ); // [object Number]
Object.prototype.toString.call( true ); // [object Boolean]
반환되는 값은 문자열이기 때문에 아래와 같이 slice를 통해 타입값만 잘라낼 수 있다.
let a = null;
function getType(data) {
// 혹은 뒤에 .toLowerCase() 를 붙여서 소문자로만 반환도 가능.
return Object.prototype.toString.call(data).slice(8, -1);
}
getType( a ) // "Null"
명시적이지 못하지만 좀 더 간단하게 쓰는 방법도 있다.
toString.call( null ) // [object Null]
toString.call( undefined ) // [object Undefined]
toString.call( 123 ) // [object Number]
toString.call( "abc" ) // [object String]
toString.call( true ) // [object Boolean]
toString.call( [1,2,3] ) // [object Array]
toString.call( { name: 'jude' } ) // [object Object]
toString.call( function() {/* --- */} ) // [object Function]
toString.call( new Date() ) // [object Date]
toString.call( Error() ) // [object Error]
toString.call( /regex-literal/i ) // [object RegExp]
toString.call( Symbol() ) // [object Symbol]
Object.prototype.toString.call() 으로 값의 타입을 정확히 알아낼 수 있다.
toString.call() 으로도 알아낼 수 있다.