Javascript获取对象的类型详解之typeof与Object.prototype.toString.call
typeof其实只有一个实际的应用(这个实际应用是用来检测一个对象是否已经定义或者是否已经赋值),而这个应用却不是用来检查对象的类型。如:
typeof foo !== 'undefined'
上面代码会检测foo 是否已经定义;如果没有定义而直接使用会导致ReferenceError 的异常。这是typeof 唯一有用的地方。
(这个描述冤枉了typeof,文章最后会为其平反。)
-------------------------华丽分割线-----------------------------------
JavaScript标准文档只给出了一种获取[[Class]] 值的方法,那就是使用Object.prototype.toString。
function is(type,obj) {
varclas = Object.prototype.toString.call(obj).slice(8, -1);
returnobj !== undefined &&obj !== null &&clas ===type;
}
is('String', 'test'); // true
is('String', new String('test')); // true
上面例子中,Object.prototype.toString 方法被调用,this 被设置为了需要获取[[Class]] 值的对象。
Object.prototype.toString 返回一种标准格式字符串,所以上例可以通过slice 截取指定位置的字符串,如下所示:
Object.prototype.toString.call([]) // "[object Array]"
Object.prototype.toString.call({}) // "[object Object]"
Object.prototype.toString.call(2) // "[object Number]"
译者注:这种变化可以从IE8和Firefox4中看出区别,如下所示:
// IE8
Object.prototype.toString.call(null) // "[object Object]"
Object.prototype.toString.call(undefined) // "[object Object]"
// Firefox 4
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
结论
为了检测一个对象的类型,强烈推荐使用Object.prototype.toString 方法;因为这是唯一一个可依赖的方式。正如上面表格所示,typeof
的一些返回值在标准文档中并未定义,因此不同的引擎实现可能不同。
除非为了检测一个变量是否已经定义,我们应尽量避免使用typeof 操作符。
-------------------------又一道华丽分割线-----------------------------------
以下是自己写的测试:
<script type="text/javascript">
var Co = (function () {
//定义私有方法
function getTypeOf(o) {
return typeof o;
}
function getPrototypeToString(o) {
return Object.prototype.toString.call(o);
}
//返回公有API
return {
//公有方法
GetTypeOf: function (o) {
return getTypeOf(o);
},
GetPrototypeToString: function (o) {
return getPrototypeToString(o);
}
}
})();
Co.GetTypeOf(0.23);
Co.GetTypeOf("test");
Co.GetTypeOf({});
Co.GetTypeOf([]);
Co.GetTypeOf(/abc/gi);
Co.GetTypeOf(true);
//------------------华丽分割线--------------------
Co.GetPrototypeToString(0.23);
Co.GetPrototypeToString("test");
Co.GetPrototypeToString({});
Co.GetPrototypeToString([]);
Co.GetPrototypeToString(/abc/gi);
Co.GetPrototypeToString(true);
</script>
运行结果:

(其实从这个结果可以看出,typeof只对基本类型有效,对引用类型返回的始终是"object")
------------------------------- 华丽补充 -------------------------------
上面关于typeof的描述有些偏颇,会让人误解了typeof的作用,正确的作用定义应该如下:
typeof是用来检测基本类型的最佳工具。
检测引用类型可以使用 instanceof,它返回布尔值。
而Object.prototype.toString.call对于检测基本类型和引用类型是通吃的。
详见《Javascript高级程序设计》p72
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端