v = {
toString: function() { return 'foo' },
valueOf: function() { return 5 }
}
console.log('' + v); //5
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] }
爲什麼v對象的值是5?空字符串如何加一個對象等於一個數字
v = {
toString: function() { return 'foo' },
valueOf: function() { return 5 }
}
console.log('' + v); //5
console.log(v); // { [Number: 5] toString: [Function], valueOf: [Function] }
爲什麼v對象的值是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談論加法運算符。這裏是相關的位:
- 讓lprim爲ToPrimitive(lval)。
- 讓rprim成爲原始(rval)。
- 如果Type(lprim)是字符串或類型(rprim)的字符串,則返回字符串即串聯接着的ToString(rprim)的ToString(lprim)
- 返回應用加法運算的結果的結果ToNumber(lprim)和ToNumber(rprim)。
它看起來像操作數應該數種之前被解析成字符串類型,讓你的表達''+v
應該叫v.toString()
第一,從而返回foo
,對不對?
其實沒有。因爲在第5步和第6步中,兩個操作數首先被分解爲它們的基元,並且這個分辨率在沒有「提示」的情況下完成。當沒有提示傳遞給ToPrimitive時,對象返回它們的默認值,這是valueOf()
方法的返回值。請參閱9.1部分了解對象如何解析爲其基元。
不知道valueOf!謝謝 – MattGoldwater
答案對我來說似乎很明顯。它似乎在與字符串連接時使用從'valueOf'返回的值。 – kamoroso94
我不明白你在問什麼。哪個對象獲得5的值?只是嘗試在瀏覽器的控制檯以下: 'V = { 的valueOf:函數(){回報5}, 的toString:函數(){回報 '富'}} 臨時 = '' + V; Number.isInteger(temp);' 你會看到最後一條命令會打印出false;因此空字符串加上一個對象似乎不等於一個數字。 – alptugd
@ kamoroso94我在問爲什麼v對象會從valueOf中獲取值而不是toString中的foo,或者爲什麼它不會嘗試向對象添加空字符串並返回類似NaN或undefined的內容? – MattGoldwater