Javascript toString对我毫无意义

MaX*_*MaX 1 javascript syntax

好吧,我刚刚做了一下,抓了一会儿.我尝试在Chrome控制台上关注:

var a = [];
toString.call(a); //[object Array]
a.toString(); //""
toString(a); //[object Object] I know it's blunder but still!
Run Code Online (Sandbox Code Playgroud)

toString和.toString有什么区别我肯定知道它们来自不同的范围(对象),但哪一个应该在什么时候使用?为什么这么乱?

Fel*_*ing 6

首先,我们必须澄清toString指的是Object.prototype.toString:

> toString === Object.prototype.toString
  true
Run Code Online (Sandbox Code Playgroud)

如何Object.prototype.toString工作在规范的第15.2.4.2节中解释:

  1. 如果this值为undefined,则返回"[object Undefined]".
  2. 如果this值为null,则返回"[object Null]".
  3. 让我们O调用ToObject传递this值作为参数的结果.
  4. class是价值[[Class]]的内部属性O.
  5. 返回字符串值是串联的三根弦的结果"[object ",class"]".

toString.call(a)Object.prototype.toString.call(a)与上述算法相同并且工作:this引用数组a(因为你使用过.call),内部[[Class]]属性有值Array,因此输出是[object Array].

a.toString():Arrays覆盖toString属性,该属性在15.4.4.2节中定义.简而言之,所有数组元素都是连接的,因为数组是空的,所以得到一个空字符串作为结果.

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,但这不是如何toString实现的.