• Object.prototype.toString.call()


    源码中有这样一段:

    class2type = {},
    toString = class2type.toString,
     
    function type(obj) {
    //obj为null或者undefined时,直接返回'null'或'undefined'
      return obj == null ? String(obj) : class2type[toString.call(obj)] || "object"
    }
     
    // Populate the class2type map
    //填充class2type的值
    $.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (i, name) {
      class2type["[object " + name + "]"] = name.toLowerCase()
    })

    --------------------------------------------------------------------------------------------------------

    在 JavaScript 里使用 typeof 来判断数据类型,只能区分基本类型,即 “number”,”string”,”undefined”,”boolean”,”object” 五种。对于数组、对象来说,其关系错综复杂,使用 typeof 都会统一返回 “object” 字符串。

    要想区别对象、数组单纯使用 typeof 是不行的。或者你会想到 instanceof 方法,例如下面这样:

    1.  
      var a = {};
    2.  
      var b = [];
    3.  
      var c = function () {};
    4.  
       
    5.  
      //a b c 都是 Object 的实例
    6.  
      console.log(a instanceof Object) //true
    7.  
      console.log(b instanceof Object) //true
    8.  
      console.log(c instanceof Object) //true
    9.  
       
    10.  
      //只有 Array 类型的 b 才是 Array 的实例
    11.  
      console.log(a instanceof Array) //false
    12.  
      console.log(b instanceof Array) //true
    13.  
      console.log(c instanceof Array) //false
    14.  
       
    15.  
      //只有 Function 类型的 c 才是 Function 的实例
    16.  
      console.log(a instanceof Function) //false
    17.  
      console.log(b instanceof Function) //false
    18.  
      console.log(c instanceof Function) //true


    从以上代码来看,要判断复合数据类型,可以如下判断:

    1.  
      //对象
    2.  
      (a instanceof Object) && !(a instanceof Function) && !(a instanceof Function)
    3.  
      //数组
    4.  
      (a instanceof Object) && (a instanceof Array)
    5.  
      //函数
    6.  
      (a instanceof Object) && (a instanceof Function)

    更简便的方式,即是使用 Object.prototype.toString.call() 来确定类型,ECMA 5.1 中关于该方法的描述[1]是这样的:

    When the toString method is called, the following steps are taken:
    If the this value is undefined, return “[object Undefined]”.
    If the this value is null, return “[object Null]”.
    Let O be the result of calling ToObject passing the this value as the argument.
    Let class be the value of the [[Class]] internal property of O.
    Return the String value that is the result of concatenating the three Strings “[object “, class, and “]”.

    由于 JavaScript 中一切都是对象,任何都不例外,对所有值类型应用 Object.prototype.toString.call() 方法结果如下:

    1.  
      console.log(Object.prototype.toString.call(123)) //[object Number]
    2.  
      console.log(Object.prototype.toString.call('123')) //[object String]
    3.  
      console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
    4.  
      console.log(Object.prototype.toString.call(true)) //[object Boolean]
    5.  
      console.log(Object.prototype.toString.call({})) //[object Object]
    6.  
      console.log(Object.prototype.toString.call([])) //[object Array]
    7.  
      console.log(Object.prototype.toString.call(function(){})) //[object Function]


    所有类型都会得到不同的字符串,几乎完美。

    思考:使用return obj == null ? String(obj) : class2type[obj.toString()] || "object"   也是可以的,作者是先将Object的tostring赋值给toString,

    用意应该是缓存变量, 便于压缩代码,
    同时可减少在原型链中的查找次数(提高代码效率)
  • 相关阅读:
    【BZOJ1046】上升序列(动态规划,贪心)
    【BZOJ1052】覆盖问题(贪心)
    【BZOJ3293】分金币(贪心)
    【BZOJ1045】糖果传递(贪心)
    【BZOJ1029】建筑抢修(贪心)
    【BZOJ3534】重建(矩阵树定理)
    【BZOJ2654】Tree(凸优化,最小生成树)
    【CF125E】MST Company(凸优化,最小生成树)
    【BZOJ4027】兔子与樱花(贪心)
    【UOJ#80】二分图最大权匹配(KM)
  • 原文地址:https://www.cnblogs.com/ckAng/p/10517030.html
Copyright © 2020-2023  润新知