2016-08-13 43 views
1
v = { 
toString: function() { return 'foo' }, 
valueOf: function() { return 5 } 
} 
console.log('' + v); //5 
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] } 

爲什麼v對象的值是5?空字符串如何加一個對象等於一個數字

+0

答案對我來說似乎很明顯。它似乎在與字符串連接時使用從'valueOf'返回的值。 – kamoroso94

+0

我不明白你在問什麼。哪個對象獲得5的值?只是嘗試在瀏覽器的控制檯以下: 'V = { 的valueOf:函數(){回報5}, 的toString:函數(){回報 '富'}} 臨時 = '' + V; Number.isInteger(temp);' 你會看到最後一條命令會打印出false;因此空字符串加上一個對象似乎不等於一個數字。 – alptugd

+0

@ kamoroso94我在問爲什麼v對象會從valueOf中獲取值而不是toString中的foo,或者爲什麼它不會嘗試向對象添加空字符串並返回類似NaN或undefined的內容? – MattGoldwater

回答

5

您創建了一個對象,v,並覆蓋其valueOf()方法返回整數5.如果一個對象沒有定義明確的valueOf()方法,然後返回valueOf()對象本身。 JavaScript中的所有內置核心對象都會覆蓋此方法以返回適當的值。例如,執行以下操作:

x = 5; 
console.log(x) 

真的是這樣做的:

console.log(x.valueOf()) // log the return value of x.valueOf() 

你可以閱讀更多關於valueOf()這裏:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/valueOf


如果你問爲什麼加入( +)運算符返回算術加法(調用v.valueOf())而不是並置,您需要參考ECAMScript規範中的答案。 Section 11.6.1談論加法運算符。這裏是相關的位:

  1. 讓lprim爲ToPrimitive(lval)。
  2. 讓rprim成爲原始(rval)。
  3. 如果Type(lprim)是字符串或類型(rprim)的字符串,則返回字符串即串聯接着的ToString(rprim)的ToString(lprim)
  4. 返回應用加法運算的結果的結果ToNumber(lprim)和ToNumber(rprim)。

它看起來像操作數應該數種之前被解析成字符串類型,讓你的表達''+v應該叫v.toString()第一,從而返回foo,對不對?

其實沒有。因爲在第5步和第6步中,兩個操作數首先被分解爲它們的基元,並且這個分辨率在沒有「提示」的情況下完成。當沒有提示傳遞給ToPrimitive時,對象返回它們的默認值,這是valueOf()方法的返回值。請參閱9.1部分了解對象如何解析爲其基元。

+0

不知道valueOf!謝謝 – MattGoldwater

相關問題