Js基本类型判断--Object.prototype.toString.call

151 阅读1分钟
  •   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 值,从而实现类型判断