林秀栋的技术博客

Object.prototype.toString.call(obj)

文章来源

Object.prototype.toString.call(obj) 常用于检测数据类型

typeof 无法区别对象,数组与null

typeof {} // 'object'
typeof [] // 'object'
typeof null // 'object'

而 Object.prototype.toString.call(obj) 可以

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

我们看下 toString 的用法:toString方法返回反映这个对象的字符串。

可以直接用 obj.toString() 吗?

"jerry".toString() //jerry
(1).toString() //1
[1,2].toString() //1,2
new Date().toString() //Wed Dec 21 2016 20:35:48 GMT+0800 (中国标准时间)
function(){}.toString() //function (){}
null.toString() //error
undefined.toString() //error

同样是检测对象obj调用toString方法,obj.toString() 和 Object.prototype.toString.call(obj) 的结果为什么不一样

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

我们可以验证一下,将数组的toString方法删除,看看会是什么结果:

var arr=[1,2,3];
console.log(Array.prototype.hasOwnProperty("toString"));//true
console.log(arr.toString());//1,2,3
delete Array.prototype.toString;//delete操作符可以删除实例属性
console.log(Array.prototype.hasOwnProperty("toString"));//false
console.log(arr.toString());//"[object Array]"