Edited at

typeofを改善したtypeOf()関数

More than 3 years have passed since last update.

undefinedやnullもちゃんと判別できる、よくあるやつ。


typeof演算子の改良版

function typeOf(x) {

if (x === null) return 'null';
if (x == null) return 'undefined';
var type = typeof x, c = x.constructor;
if (type === 'number') {
if (isNaN(x)) return 'NaN';
if (!isFinite(x))
return x === Infinity ? 'Infinity' : '-Infinity';
}
if (type === 'object') {
return c && c.name ? c.name :
Object.prototype.toString.call(x).slice(8, -1);
}
return type;
}


typeOfの戻り値

console.log(typeOf(undefined));         //'undefined'

console.log(typeOf(null)); //'null'
console.log(typeOf("str")); //'string'
console.log(typeOf(new String("str"))); //'String'
console.log(typeOf(true)); //'boolean'
console.log(typeOf(new Boolean(true))); //'Boolean'
console.log(typeOf(1)); //'number'
console.log(typeOf(NaN)); //'NaN'
console.log(typeOf(Infinity)); //'Infinity'
console.log(typeOf(-Infinity)); //'-Infinity'
console.log(typeOf(new Number(1))); //'Number'
console.log(typeOf(function(){})); //'function'
console.log(typeOf([])); //'Array'
console.log(typeOf(/aaa/)); //'RegExp'
console.log(typeOf(new Date)); //'Date'
console.log(typeOf(document)); //'Document'
console.log(typeOf({})); //'Object'
console.log(typeOf(Object.create(null))); //'Object'
console.log(typeOf(new function Hoge(){})); //'Hoge' IEでは'Object'

細かいことを言えばNaNやInfinityはnumber扱いでいいのかみたいな話もあるし、1とnew Number(1)が違う扱いになっているのは逆に不便だったりするかも。

実務で使ったことがないので、間違ってたら教えてください。