Javascript 为什么Object.prototype.toString.call()给出的输出与Object.prototype.toString()不同?
当我在控制台中进行测试时,我在阅读的一些代码中发现了一些东西: Object.prototype.toString("foo"); // output: "[object Object]" Object.prototype.toString.call("foo"); // output: "[object String]" Object.prototype.toString(“foo”);//输出:“[对象]” Object.prototype.toString.call(“foo”);//输出:“[对象字符串]”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”);//输
我想我可能有一个模糊的想法,但我无法用语言表达。。。有人能解释一下吗?调用
的第一个参数是函数内部的对象,而不是函数的第一个参数:
"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')
,因为字符串原语被包装在字符串
对象中。