2013-10-15 109 views
1

这里的东西我在一些代码,我在读的时候发现我在控制台测试:为什么Object.prototype.toString.call()会给出与Object.prototype.toString()不同的输出?

 
Object.prototype.toString("foo"); // output: "[object Object]" 

Object.prototype.toString.call("foo"); // output: "[object String]" 

我想我可能有一个微弱的想法,但我无法用言语表达...谁能解释一下吗?

+1

阅读docs为[该'call'方法](https://developer.mozilla.org/en -US /文档/网络/的JavaScript /参考/ Global_Objects /功能/调用)。输出是不同的,因为你正在进行截然不同的调用。 ['toString'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString)不带参数。 – Bergi

回答

4

两个呼叫是NOT当量。

第一呼叫:

Object.prototype.toString("foo"); 

调用的Object.prototype上下文中toString方法,与另外的"foo"参数(未使用的),和Object.prototypeObject,所以结果是[object Object]

的第二个电话:

Object.prototype.toString.call("foo"); 

调用toString方法中的"foo"背景下,并且Object.prototype.toString构建从它(new String("foo"))对象,所以结果是[object String]

+0

实际上''foo“'是一个原始值,只有当[流传到一个对象](http://es5.github.io/#x15.2.4.2)时它才会成为一个String实例。 – Bergi

+0

你会如何建议我改说?我现在有点不确定。 –

+0

好的,当我调用''foo“.toString()'时,我再次在”foo“上下文中调用它?为什么在这种情况下输出不同('“foo”')? –

0

call第一个参数是对象,这将是this在函数内部,而不是函数的第一参数:

"use strict"; 
function test(a,b) { 
    console.log(this, a, b); 
}; 
var obj = { 
    'func' : test 
} 
test(1,2) // outputs undefined 1 2 
test.call(1,2); // outputs 1 2 undefined 
obj.func(1,2) // outputs obj 1 2 
obj.func.call(1,2) // outputs 1 2 undefined 
相关问题