Javascript 为什么toString()有两种不同的工作方式?

Javascript 为什么toString()有两种不同的工作方式?,javascript,tostring,Javascript,Tostring,我经常以两种不同的方式使用toString(),但直到最近我才意识到我不了解发生的事情的机制 例如,我使用此函数返回对象的类型: var getType = function (obj) { return Object.prototype.toString.call(obj).slice(8, -1); }; getType([1,2,3]) // returns "Array" 但如果我这样做了 [1,2,3].toString() 我会得到 "1,2,3" 我认为,call只

我经常以两种不同的方式使用toString(),但直到最近我才意识到我不了解发生的事情的机制

例如,我使用此函数返回对象的类型:

var getType = function (obj) {
    return Object.prototype.toString.call(obj).slice(8, -1);
};

getType([1,2,3]) // returns "Array"
但如果我这样做了

[1,2,3].toString()
我会得到

"1,2,3"
我认为,
call
只是用一个给定的
this
调用函数,它等于
[1,2,3]

类似地,我认为执行
[1,2,3].toString()
调用带有
[1,2,3]
的toString作为
这个值

在这两种情况下都没有参数,
这个值是相同的,那么有什么不同呢?

这是因为

Array.prototype.toString!==Object.prototype.toString
例如:

Array.prototype.toString.call([1,2,3]);//"1,2,3"
Object.prototype.toString.call([1,2,3]);//“[对象数组]”
那是因为

Array.prototype.toString!==Object.prototype.toString
例如:

Array.prototype.toString.call([1,2,3]);//"1,2,3"
Object.prototype.toString.call([1,2,3]);//“[对象数组]”


[1,2,3]。toString!==Object.prototype.toString
。您必须调用相同的函数才能使这些调用等效。是的,但您调用的是两个不同的函数。我看到数组定义了自己的
toString()
函数,该函数将覆盖对象
toString()
JavaScript有几种不同的数据类型,大多数都有自己的
.toString()
方法。这是有意义的,因为不同类型的序列化自然需要不同的进程。相关:
[1,2,3]。toString!==Object.prototype.toString
。您必须调用相同的函数才能使这些调用等效。是的,但您调用的是两个不同的函数。我看到数组定义了自己的
toString()
函数,该函数将覆盖对象
toString()
JavaScript有几种不同的数据类型,大多数都有自己的
.toString()
方法。这是有意义的,因为不同类型的序列化自然需要不同的进程。相关:@test您需要括号:
({a:'a'})。toString
。或者
({a:'a'}.toString)
。或者
varo={a:'a'};o、 toString
谢谢,从逻辑上讲,我希望能够调用
{a:'a'}.toString()
,就像我调用
[1,2,3].toString()
一样,但这不起作用。一个语句的语法不同,而两个语句的输出不同。@测试是因为如果用
{…}
启动一个语句,它就是一个。所以你必须做点什么让它成为一种表达。添加括号可以做到这一点。然后它被解析为一个而不是一个块。@测试否,它认为它是一个块
{a:'b'}
是a,
a
是a,它计算
'b'
。您应该提到原型继承。@测试需要括号:
({a:'a'})。toString
。或者
({a:'a'}.toString)
。或者
varo={a:'a'};o、 toString
谢谢,从逻辑上讲,我希望能够调用
{a:'a'}.toString()
,就像我调用
[1,2,3].toString()
一样,但这不起作用。一个语句的语法不同,而两个语句的输出不同。@测试是因为如果用
{…}
启动一个语句,它就是一个。所以你必须做点什么让它成为一种表达。添加括号可以做到这一点。然后它被解析为一个而不是一个块。@测试否,它认为它是一个块
{a:'b'}
是a,
a
是a,它计算
'b'
。您应该提到原型继承。