2013-10-15 110 views
1

這裏的東西我在一些代碼,我在讀的時候發現我在控制檯測試:爲什麼Object.prototype.toString.call()會給出與Object.prototype.toString()不同的輸出?

 
Object.prototype.toString("foo"); // output: "[object Object]" 

Object.prototype.toString.call("foo"); // output: "[object String]" 

我想我可能有一個微弱的想法,但我無法用言語表達...誰能解釋一下嗎?

+1

閱讀docs爲[該'call'方法](https://developer.mozilla.org/en -US /文檔/網絡/的JavaScript /參考/ Global_Objects /功能/調用)。輸出是不同的,因爲你正在進行截然不同的調用。 ['toString'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/toString)不帶參數。 – Bergi

回答

4

兩個呼叫是NOT當量。

第一呼叫:

Object.prototype.toString("foo"); 

調用的Object.prototype上下文中toString方法,與另外的"foo"參數(未使用的),和Object.prototypeObject,所以結果是[object Object]

的第二個電話:

Object.prototype.toString.call("foo"); 

調用toString方法中的"foo"背景下,並且Object.prototype.toString構建從它(new String("foo"))對象,所以結果是[object String]

+0

實際上''foo「'是一個原始值,只有當[流傳到一個對象](http://es5.github.io/#x15.2.4.2)時它纔會成爲一個String實例。 – Bergi

+0

你會如何建議我改說?我現在有點不確定。 –

+0

好的,當我調用''foo「.toString()'時,我再次在」foo「上下文中調用它?爲什麼在這種情況下輸出不同('「foo」')? –

0

call第一個參數是對象,這將是this在函數內部,而不是函數的第一參數:

"use strict"; 
function test(a,b) { 
    console.log(this, a, b); 
}; 
var obj = { 
    'func' : test 
} 
test(1,2) // outputs undefined 1 2 
test.call(1,2); // outputs 1 2 undefined 
obj.func(1,2) // outputs obj 1 2 
obj.func.call(1,2) // outputs 1 2 undefined 
相關問題