好的,我刚刚做了这件事并且抓了一会儿。我尝试在Chrome控制台上关注:
var a = [];
toString.call(a); //[object Array]
a.toString(); //""
toString(a); //[object Object] I know it's blunder but still!
toString和.toString有什么区别我肯定知道它们来自不同的范围(对象),但哪一个应该在什么时候使用?为什么这么乱?
答案 0 :(得分:6)
首先,我们必须澄清toString
是指Object.prototype.toString
:
> toString === Object.prototype.toString
true
section 15.2.4.2 of the specification
中解释了Object.prototype.toString
的工作原理
- 如果
this
值为undefined
,请返回"[object Undefined]"
。- 如果
this
值为null
,请返回"[object Null]"
。- 让
O
成为调用ToObject
传递this
值作为参数的结果。- 让
class
为[[Class]]
的{{1}}内部属性的值。- 返回串联三个字符串
醇>O
,"[object "
和class
的结果的字符串值。
"]"
与toString.call(a)
相同,并根据上述算法运行:Object.prototype.toString.call(a)
引用数组this
(因为您使用了a
),内部.call
属性的值为[[Class]]
,因此输出为Array
。
[object Array]
:数组覆盖a.toString()
属性,该属性在section 15.4.4.2中定义。简而言之,所有数组元素都是连接的,因为数组是空的,结果会得到一个空字符串。
toString
与toString(a)
相同。这个论点完全被忽略了。因此Object.prototype.toString()
引用this
,它是一个对象,根据上面提到的算法,输出为Object.prototype
。对于[object Object]
的任何值,输出都是相同的。
应该在什么时候使用哪一个?
这取决于你想做什么。就个人而言,除了一些快速和脏的调试之外,我发现内置的a
函数都没有特别有用。
toString
应为toString.call(a)
嗯,== a.toString()
和Object.prototype.toString
只是两种不同的方法,因此您会得到不同的结果。
你可以说Array.prototype.toString
应该覆盖被覆盖的Object.prototype.toString
,如果它存在的话,那就不是toString
的实现方式了。