typeof和Object.prototype.toString

typeof是javascript中的运算符,不是函数,typeof会给出某个对象的类型字符串。下表给出了不同类型的typeof结果

参见数据类型的typeof结果
typeof 结果
true/false "boolean"
12.00/NaN "number"
hello world "string"
{a:10}"object"
[ ]"object"
/.*/"object"
null "object"
undefined "undefined"
function(){} "function"
从上表可以发现一个问题,typeof对于null会返回object,而通常程序中对null都会有不同的处理,无法将null和object区分开。数组也不能从object中区分开。

为了更灵活的处理不同的数据类型,很多第三方库都会寻找typeof的替代方案,就是使用Object.prototype.toString方法,它会返回"[object xxxx]"形式的字符串,其中xxxx会包含更加详细的类型信息,以jquery为例,$.type的定义如下


// map用途
class2type = {};

// 生成map的键值对
jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
class2type[ "[object " + name + "]" ] = name.toLowerCase();
});

// 如果obj不是null,直接调用toString方法作为map的key以获取类型值
$.type = function( obj ) {
    return obj == null ? String( obj ) : class2type[ toString.call(obj) ] || "object";
};
Show Comments

Get the latest posts delivered right to your inbox.