[英]Javascript toString making no sense to me
好吧,我只是做了一下,撓了一下頭。 我在Chrome控制台上嘗試了以下操作:
var a = [];
toString.call(a); //[object Array]
a.toString(); //""
toString(a); //[object Object] I know it's blunder but still!
toString和.toString有什么區別?我絕對知道它們來自不同的作用域(對象),但是應該在什么時候使用哪一個? 為什么這么亂?
首先,我們必須澄清toString
是指Object.prototype.toString
:
> toString === Object.prototype.toString
true
在規范的15.2.4.2節中說明了Object.prototype.toString
工作方式:
- 如果
this
值undefined
,則返回"[object Undefined]"
。- 如果
this
值為null
,則返回"[object Null]"
。- 令
O
為調用ToObject
並將this
值作為參數傳遞的結果。- 令
class
為O
的[[Class]]
內部屬性的值。- 返回將三個字符串
"[object "
,class
和"]"
串聯在一起的結果的String值。
toString.call(a)
與Object.prototype.toString.call(a)
相同,並且根據上述算法工作: this
是Object.prototype.toString.call(a)
組a
(因為您使用了.call
),內部[[Class]]
屬性具有值Array
,因此輸出為[object Array]
。
a.toString()
:數組將覆蓋在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
,但這不是toString
實現的方式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.