好吧,我刚刚做了一下,抓了一会儿.我尝试在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有什么区别我肯定知道它们来自不同的范围(对象),但哪一个应该在什么时候使用?为什么这么乱?
首先,我们必须澄清toString指的是Object.prototype.toString:
> toString === Object.prototype.toString
true
Run Code Online (Sandbox Code Playgroud)
如何Object.prototype.toString工作在规范的第15.2.4.2节中解释:
- 如果
this值为undefined,则返回"[object Undefined]".- 如果
this值为null,则返回"[object Null]".- 让我们
O调用ToObject传递this值作为参数的结果.- 让
class是价值[[Class]]的内部属性O.- 返回字符串值是串联的三根弦的结果
"[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实现的.
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |