为了账号安全,请及时绑定邮箱和手机立即绑定

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]

求解释以上的三种结果


正在回答

2 回答

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

11 回复 有任何疑惑可以回复我~
#1

前端功臣狮

Bosn手动点赞
2016-06-23 回复 有任何疑惑可以回复我~

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]

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

3 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
JavaScript深入浅出
  • 参与学习       281100    人
  • 解答问题       1020    个

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

进入课程

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

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信