问答详情
源自:6-3 [JavaScript]this

Object.prototype.toString.call(this)和Object.prototype.toString(this)的区别;

function fo(){

  console.log(this);      

  console.log(Object.prototype.toString.call(this));

  console.log(Object.prototype.toString(this));

}

fo.call("hello");

运行结果:

String { 0="h",  1="e",  2="l", 3="l" ,4="o"}

[object String]

[object Object]

求解释以上的三种结果


提问者:csbin 2015-03-27 10:23

个回答

  • Bosn
    2015-03-28 07:50:18

    fo.call("hello");  这样用call去调用foo,目的就是修改fo函数内的this。由于使用call/apply时(一般非严格模式下)会进行基本类型到包装类型的转换,所以fo中的this实际上是new String("hello"); 是一个String对象。

    function foo(){
        console.log(typeof this); // "object"
        console.log(this.toString()); // "hello"
    }  
    foo.call("hello");

    所以第一个console.log输出String对象。

    第二个在第一章数据类型章节讲过,通过Object.prototype.toString.apply/call可以间接拿到对象的内部[[class]]标签,对于String对象会返回[object String]


    而直接调用Object.prototype.toString会返回[object Object],是因为如此调用内部this指向的是Object.prototype。

    类似于:

    var obj = {x : 1};
    obj.toString(); // [object Object]

    需了解Object.prototype是一个对象,它作为Object实例的对象的原型。

  • syl_12
    2015-03-27 11:33:38

    Object.prototype.toString.call(this) :

    a.call(b); 是将a对象的方法运用到b对象上,fo.call("hello") 是改变当前this对象的的指向,调用fo.call("hello")传入的是一个String,Object.prototype.toString.call(this)  是将toString方法运用于this对象,而此时对象为String,多以输出[object String] 

    Object.prototype.toString(this) :

    并没有改变this对象的指向,

    每一个object都有toString()方法 并且是被自动调用的,如果不被重写 将会 returns "[object type]" var o = new Object();

    o.toString();           // returns [object Object]

    个人想法 也有点模糊,希望其他大神给予清晰正确的解释