使用Object.prototype.toString.call(obj)而不是使用typeof来检测对象类型

Daming 2018-01-22
0条评论 716 次浏览
Daming 2018-01-220条评论 716 次浏览

使用typeof duxiang === “object”检测”duixiang”是不是对象,这个方案是不可行的,因为JavaScript中所有的事物都是对象,null 的结果也是 object,Array 的结果也是 object,有时候我们需要的是 “纯粹” 的 object 对象,可以使用下面的方案:

Object.prototype.toString.call(obj) === "[object Object]"

除了自定义对象无法区分 ,其他的都可以:

console.log(Object.prototype.toString.call("jerry"));//[object String]
console.log(Object.prototype.toString.call(12));//[object Number]
console.log(Object.prototype.toString.call(true));//[object Boolean]
console.log(Object.prototype.toString.call(undefined));//[object Undefined]
console.log(Object.prototype.toString.call(null));//[object Null]
console.log(Object.prototype.toString.call({name: "jerry"}));//[object Object]
console.log(Object.prototype.toString.call(function(){}));//[object Function]
console.log(Object.prototype.toString.call([]));//[object Array]
console.log(Object.prototype.toString.call(new Date));//[object Date]
console.log(Object.prototype.toString.call(/\d/));//[object RegExp]

为什么不直接用obj.toString()呢?
console.log("jerry".toString());//jerry

因为toString为Object的原型方法,而Array ,function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,根据原型链的知识,调用的是对应的重写之后的toString方法(function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串…..),而不会去调用Object上原型toString方法(返回对象的具体类型),所以采用obj.toString()不能得到其对象类型,只能将obj转换为字符串类型;因此,在想要得到对象的具体类型时,应该调用Object上原型toString方法。

1+

发表评论

电子邮件地址不会被公开。