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

来源:6-3 [JavaScript]this

csbin

2015-03-27 10:23

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]

求解释以上的三种结果


写回答 关注

2回答

  • 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实例的对象的原型。

    前端功臣狮

    Bosn手动点赞

    2016-06-23 09:55:26

    共 1 条回复 >

  • 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]

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

JavaScript深入浅出

由浅入深学习JS语言特性,且解析JS常见误区,从入门到掌握

281102 学习 · 1020 问题

查看课程

相似问题