https://cloud.tencent.com/developer/article/1508145 https://xieliuduo.github.io/Blog/articles/js/JavaScript%E4%B8%ADObject.prototype.toString%E6%96%B9%E6%B3%95%E7%9A%84%E5%8E%9F%E7%90%86.html https://www.cnblogs.com/cangqinglang/p/9143308.html
我们平常判断数据结构类型的时候,会使用很多方法,比如typeof、instanceOf等等,但是有一个终极解决办法,就是Object.prototype.toString.call,这个方法可以判断我们所有的数据类型
使用:
Object.prototype.toString.call('An') // "[object String]"
Object.prototype.toString.call(1) // "[object Number]"
Object.prototype.toString.call(Symbol(1)) // "[object Symbol]"
Object.prototype.toString.call(null) // "[object Null]"
Object.prototype.toString.call(undefined) // "[object Undefined]"
Object.prototype.toString.call(function(){}) // "[object Function]"
Object.prototype.toString.call({name: 'An'}) // "[object Object]"
原理:
其实Object原型上面的toString方法是可以判断各种类型的,那为什么直接用被判断的对象的toString方法就不行呢?
因为我们所有的数据类型是继承自Object,但是每一个数据类型里面的toString都被重写过,所以我们使用如下会出现的结果:
let a = 1;
a.toString() // '1'
Object.prototype.toString() // [object object]
Number.prototype.toString() // '0'
也就是说,原本我们类型上挂载的toString方法是可以判断出来各自的类型的,并且展现形式就是[object type],只不过被重写了,可以进行如下测试:
Number.prototype.hasOwnProperty('toString') // true
delete Number.prototype.toString
Number.prototype.hasOwnProperty('toString') // false
let a = 1;
a.toString() // [object Number]
所以我们使用Object.prototype.toString.call(要判断的值),实际上是在修改toString使用的作用域,这样就相当于使用原生的toString方法了
优点:
所有数据类型都可以很清楚地判断出来
缺点:
不能判断自定义对象