2015-04-22 129 views
0

return toString.call(obj)return obj.toString()有什麼區別?將toString與toString進行比較

我經常發現這些不同風格的

+0

關鍵的區別不在於性能,而在於'toString!== obj.toString'的可能性。告訴我們更多關於'toString'和'obj'的信息,我們將能夠回答你的問題... – Bergi

+0

[toString()方法返回一個代表對象的字符串](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString) – ozil

+0

這些片段返回不同的字符串。 – undefined

回答

1

toString.call(obj)返回對象的類型代碼,而obj.toString()返回對象的字符串表示,或者如果它沒有執行這個函數對象的類型。

實施例:

var a = [5]; 
a.toString() // "5" 
toString.call(a) // "[object Array]" 

更多細節可以在MDN找到:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString

使用的toString()來檢測對象類:

var toString = Object.prototype.toString; 

toString.call(new Date); // [object Date] 
toString.call(new String); // [object String] 
toString.call(Math);  // [object Math] 

// Since JavaScript 1.8.5 
toString.call(undefined); // [object Undefined] 
toString.call(null);  // [object Null] 

UnderscoreJS使用toString.call(obj)代替typeOf,因爲它是更快:

_.isNumber = function(obj) { 
    return toString.call(obj) == '[object Number]'; 
}; 
+2

像這樣使用'toString'是我見過的最糟糕的全局對象... – Bergi

+0

它只是用來舉個例子! – SpartakusMd

+0

你應該解釋一下它究竟是什麼,它是如何工作的,以及它會如何做得更好:-) – Bergi

1

當你打電話給toString.call(obj)你實際上正在做的是調用window.toString(call)這就是說你正在調用應用於你的對象obj的全局對象的toString函數。

當您調用obj.toString()時,您可以調用實際對象的toString函數,該函數可能在本地實現 - 例如,用於序列化或演示目的 - 或者原型鏈上的某處。

試試這個:
toString === window.toString; // true

編輯:
在Node.js的全局對象實際上是所謂global,在瀏覽器中它仍將window

+0

只是要精確 - 全局對象不是_always_'window',只能在瀏覽器中運行。 –

+0

確實@JamesThorpe。 – Cros