重写toString方法
简单数据类型Number、Boolean,复杂数据类型中的Array、Function都是Object类的实例,会继承Object的toString方法,但是这些类型的toString方法都进行了重写。因此,当我们直接调用toString方法会将各种类型转化为字符串,结果如下:
console.log((123).toString()) //'123'
console.log((true).toString()) //'true'
console.log([1,2,3].toString()) //'1,2,3'
function fn(){}
console.log(fn.toString()) //'function fn(){}'
console.log({}.toString()) //'[object Object]'
Object原型上的toString方法
当我们把重写的toString方法删除后,再进行相同的调用,此时会通过原型链找到Object原型上的toString方法,结果如下:
delete Number.prototype.toString
console.log((123).toString()) //'[object Number]'
因此,我们要判断数据类型就要调用Object原型上的toString方法,使用call()来进行调用,结果如下:
console.log(Object.prototype.toString.call(123)) //'[object Number]'
console.log(Object.prototype.toString.call('123')) //'[object String]'
console.log(Object.prototype.toString.call(true)) //'[object Boolean]'
console.log(Object.prototype.toString.call([1,2,3])) //'[object Array]'
console.log(Object.prototype.toString.call({})) //'[object Object]'
console.log(Object.prototype.toString.call(function fn(){})) //'[object Function]'