-
function getType(obj) { const str = Object.prototype.toString.call(obj); const type = { '[object Boolean]': 'boolean', '[object Number]': 'number', '[object String]': 'string', '[object Function]': 'function', '[object Array]': 'array', '[object Date]': 'date', '[object RegExp]': 'regExp', '[object Undefined]': 'undefined', '[object Null]': 'null', '[object Object]': 'object' }; return type[str];} getType([1,2,3])//array
为什么是Object.prototype.toString呢?
因为toString为Object的原型方法,而Array 、Function等类型作为Object的实例,都重写了toString方法。不同的对象类型调用toString方法时,调用的是对应的重写之后的toString方法(Function类型返回内容为函数体的字符串,Array类型返回元素组成的字符串.....),而不是去调用Object上原型toString方法
那为什么加.call()呢?
Object.prototype 也是一个对象,Object.prototype.toString 调用的是 Object.prototype 这个对象的 toString 方法,所以永远是 "[object Object]", 而以Object.prototype.toString.call 的形式调用,通过传入参数,改变函数运行时使用的 this 值,从而实现类型判断