toString

Object.prototype.toString.call()

Object.prototype.toString.call({})              // '[object Object]'
Object.prototype.toString.call([])              // '[object Array]'
Object.prototype.toString.call(() => {})        // '[object Function]'
Object.prototype.toString.call('seymoe')        // '[object String]'
Object.prototype.toString.call(1)               // '[object Number]'
Object.prototype.toString.call(true)            // '[object Boolean]'
Object.prototype.toString.call(Symbol())        // '[object Symbol]'
Object.prototype.toString.call(null)            // '[object Null]'
Object.prototype.toString.call(undefined)       // '[object Undefined]'
 
Object.prototype.toString.call(new Date())      // '[object Date]'
Object.prototype.toString.call(Math)            // '[object Math]'
Object.prototype.toString.call(new Set())       // '[object Set]'
Object.prototype.toString.call(new WeakSet())   // '[object WeakSet]'
Object.prototype.toString.call(new Map())       // '[object Map]'
Object.prototype.toString.call(new WeakMap())   // '[object WeakMap]'
 

Object 上的 toString()方法,它的作用是返回当前方法执行的主体(方法中的 this )所属类的详细信息即 “[object Object]”, 其中第一个 object 代表当前实例是对象数据类型的(这个是固定死的,不会改变),第二个 Object 代表的是 this 所属的类是 Object。

原理

在 toString 方法被调用时,会执行下面的操作步骤:

  1. 如果 this 未定义时,返回“[object Undefined]”
  2. 如果 this 为 null 时,返回“[object Null]”
  3. 定义 O,并且让 O=ToObject(this)
  4. 获取 this 对象的 Class 属性的值.
  5. 计算出三个字符串”[object ”, 第一步的操作结果 Result(1), 以及 ”]“连接后的新字符串.
  6. 返回第二步的操作结果 Result(2).

Class 是一个内部属性,所有的对象(原生对象和宿主对象)都拥有该属性.在规范中, Class 是这么定义的:一个字符串值,表明了该对象的类型.

可以清晰的得出 toString()是在以特殊的字符串形式输出 this 的类型,不管你传入什么参数,该方法都是执行了 window.toString() 方法,this 一直指向了 window 对象
所以在判断类型时也可以直接使用 toString.call(arr)

isArray

ES6 的 isArray 也是通过 toString 实现的

if (!Array.isArray) {
  Array.isArray = function(arg) {
    return Object.prototype.toString.call(arg) === '[object Array]';
  };
}

封装函数

    var type = function(data) {
      var toString = Object.prototype.toString;
      var dataType = toString
              .call(data)
              .replace(/\[object\s(.+)\]/, "$1")
              .toLowerCase()
      return dataType
};