Javascript 为什么Object.prototype.toString.call()给出的输出与Object.prototype.toString()不同?

Javascript 为什么Object.prototype.toString.call()给出的输出与Object.prototype.toString()不同?,javascript,Javascript,当我在控制台中进行测试时,我在阅读的一些代码中发现了一些东西: Object.prototype.toString("foo"); // output: "[object Object]" Object.prototype.toString.call("foo"); // output: "[object String]" Object.prototype.toString(“foo”);//输出:“[对象]” Object.prototype.toString.call(“foo”);//输

当我在控制台中进行测试时,我在阅读的一些代码中发现了一些东西:

Object.prototype.toString("foo"); // output: "[object Object]" Object.prototype.toString.call("foo"); // output: "[object String]" Object.prototype.toString(“foo”);//输出:“[对象]” Object.prototype.toString.call(“foo”);//输出:“[对象字符串]”
我想我可能有一个模糊的想法,但我无法用语言表达。。。有人能解释一下吗?

调用
的第一个参数是函数内部的
对象,而不是函数的第一个参数:

"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

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

这两个调用不等价

第一个电话:

Object.prototype.toString("foo");
Object.prototype
的上下文中调用
toString
方法,并添加一个
“foo”
参数(未使用)和
对象。prototype
是一个
对象
,因此结果是
[Object Object]

第二个电话:

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

“foo”
Object.prototype.toString的上下文中调用
toString
方法。toString
从中构建一个对象(
新字符串(“foo”)
),因此结果是
[对象字符串]
这两个调用是不等价的

第一个电话:

Object.prototype.toString("foo");
Object.prototype
的上下文中调用
toString
方法,并添加一个
“foo”
参数(未使用)和
对象。prototype
是一个
对象
,因此结果是
[Object Object]

第二个电话:

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

“foo”
Object.prototype.toString的上下文中调用
toString
方法,toString
从中构建一个对象(
新字符串(“foo”)
),因此结果是
[对象字符串]

读取文档以获取更多信息。输出是不同的,因为您正在进行完全不同的调用。不接受参数。请阅读文档以获取参数。输出是不同的,因为您正在进行完全不同的调用。不接受参数。实际上,
“foo”
是一个基本值,只有当它成为
字符串
实例时才是。您建议我如何改写它?我现在有点不确定。好吧,当我调用
“foo”.toString()
,我会在“foo”上下文中再次调用它吗?为什么在这种情况下输出不同(
“foo”
)?因为在第一种情况下,“foo”是上下文,而在第二种情况下它只是一个参数,但是
toString()
方法只在上下文上运行。@adityameon因为
'foo'。toString()
基本上是
String.prototype.toString.call('foo')
,由于string原语被包装在
string
对象中。实际上
“foo”
是一个原语值,只有当它成为
string
实例时才是。您建议我如何改写它?我现在有点不确定。好吧,当我调用
“foo”.toString()
,我会在“foo”上下文中再次调用它吗?为什么在这种情况下输出不同(
“foo”
)?因为在第一种情况下,“foo”是上下文,而在第二种情况下它只是一个参数,但是
toString()
方法只在上下文上运行。@adityameon因为
'foo'。toString()
基本上是
String.prototype.toString.call('foo')
,因为字符串原语被包装在
字符串
对象中。