2013-03-03 18 views
2

正在讀取Underscore.js以瞭解其方法is[String|Number|...]如何工作,現在我感到困惑。下劃線作用:爲什麼toString.call('my string')與'my string'.toString()不同,或者,爲什麼是document.toString!=='asd'.toString?

toString.call(obj) == ['object ' + name + ']'; 

好了,所以,我可以做

>>> toString.call('my string') 
"[object String]" 

>>> 'my string'.toString() 
"my string" 

我敢在這裏輸了!在第一次調用我有:

>>> document.toString === toString 
true 

而且

>>> document.toString === 'asd'.toString 
false 

所以,我很困惑。我沒有想到這種行爲。

+0

爲了澄清,我承認,'「的字符串」的ToString()'應該* *邏輯迴歸'「的字符串」'。但是這似乎與當你執行'toString.call(「字符串」)'時會發生什麼衝突。 – 2013-03-03 05:06:20

+0

你爲什麼會認爲兩種不同的功能會有相同的行爲?僅僅因爲它們都被稱爲'toString'並不意味着它們應該做同樣的事情...... – Xymostech 2013-03-03 05:11:09

+0

@Xymostech:我會猜想它們都從'Object.prototype.toString'繼承。我不會想到會有多個'toString'的實現。特別是因爲'String.toString()'是非常多的 - 儘管邏輯必要性 - 如果你願意的話,一個「毫無價值」的禁用操作。 – 2013-03-03 05:15:44

回答

4

這是因爲:

document.toString === Object.prototype.toString 

它實現的toString最基本的版本,一個是類似於:

'[object ' + (typeof this) + ']'; 

這是String.toString(),它只是輸出字符串本身,即非常不同:

> String.prototype.toString.call('hello world') 
"hello world" 

Array.toString()它輸出逗號分隔的一串值。

> Array.prototype.toString.call([1,2,3]) 
"1,2,3" 

使用.call()

爲了使這項工作,他們基本上在對象上使用.call()適用toString()

toString.call(obj) 

裏面的toString方法,this現指obj。這相當於:

Object.prototype.toString.call(obj) 
+0

謝謝@Jack。我一直在尋找你寫在最後的等價物,而不是在正確的地方尋找。現在這是有道理的。 – 2013-03-03 05:19:13

相關問題