Object.prototype.toString.call()为什么可以用来检测数据类型?

 obj.toString()方法是用来干什么的
      每一个对象都有一个toString()方法,默认情况下toString()被每一个Object对象继承,如果此方法未被重写,toString()返回"[object type]",其中的type是对象的类型。

      let obj = new Object()
      obj.toString()      // "[object Object]"

      MDN上是这么写的,toString()方法用久了转字符串,都没好好看过概念,习惯性以为只是返回一个字符串。比如:

      let num = 123
      let fun = function(){}
      let arr = [1, 2, 3]
      num.toString()      // "123"
      fun.toString()      // "function(){}"
      arr.toString()      // "1,2,3"
      
       这里并没有得到对象类型,是因为toString()方法为Object的原型方法,而Array, Function, Number等作为Object的实例,都重写了toString方法,
      不同的类型的对象调用toString方法时,会根据原型链往上找,找到的都是重写后的toString()方法,如果我们删除重写后的toString()方法后,
      执行arr.toString()方法就能调用Object原型上的toString()方法

      delete Array.prototype.toString
      arr.toString()      // "[object Array]"
     
            也就是说如果对象的toString()方法未被重写,就可以拿到数据类型,但是大部分时候toString()方法都是被重写的,
      这时,就需要call()或者apply()来直接调用Object.prototype.toString()

posted @ 2020-11-24 17:50  有道学生  阅读(395)  评论(0)    收藏  举报