Javascript toString对我毫无意义

时间:2013-01-26 00:59:34

标签: javascript syntax

好的,我刚刚做了这件事并且抓了一会儿。我尝试在Chrome控制台上关注:

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

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

1 个答案:

答案 0 :(得分:6)

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

> toString === Object.prototype.toString
  true

section 15.2.4.2 of the specification

中解释了Object.prototype.toString的工作原理
  
      
  1. 如果this值为undefined,请返回"[object Undefined]"
  2.   
  3. 如果this值为null,请返回"[object Null]"
  4.   
  5. O成为调用ToObject传递this值作为参数的结果。
  6.   
  7. class[[Class]]的{​​{1}}内部属性的值。
  8.   
  9. 返回串联三个字符串O"[object "class的结果的字符串值。
  10.   

"]"toString.call(a)相同,并根据上述算法运行:Object.prototype.toString.call(a)引用数组this(因为您使用了a),内部.call属性的值为[[Class]],因此输出为Array

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

toStringtoString(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的实现方式了。