所有對象繼承了Object.prototype的兩個轉換方法:
第一個是toString(),它的作用是返回一個反映這個對象的字符串;
第二個是valueOf(),它的作用是返回它相應的原始值;
但一些內置對象重寫了這兩個方法,下面展示了一些內置對象調用這兩個方法的返回情況。
| 類型 | toString | valueOf |
| Object | 返回"[object ObjectName]",其中 ObjectName 是對象類型的名稱。 | 對象本身。這是默認情況。 |
| String | 返回 String 對象的值 | 字符串值。 |
| Number | 返回數值的字符串表示。還可返回以指定進制表示的字符串,請參考Number.toString()。 | 數字值。 |
| Boolean | 如果布爾值是true,則返回"true"。否則返回"false"。 | Boolean 值。 |
| Array |
將 Array 的每個元素轉換為字符串,並將它們依次連接起來,兩個元素之間用英文逗號作為分隔符進行拼接。 | 數組本身 |
| Date |
返回日期的文本表示。 | 存儲的時間是從 1970 年 1 月 1 日午夜開始計的毫秒數 UTC |
| Function | 返回如下格式的字符串,其中 functionname 是一個函數的名稱,此函數的 toString 方法被調用: "function functionname() { [native code] }" | 函數本身。 |
測試代碼:
1 var _ps = Object.prototype.toString; 2 var _pv = Object.prototype.valueOf; 3 4 Object.prototype.toString= function(){ 5 console.log('proto tostring'); 6 return _ps.call(this); 7 }; 8 Object.prototype.valueOf= function(){ 9 console.log('proto valueof'); 10 return _pv.call(this); 11 } 12 var a={ 13 toString: function(){ 14 console.log('a tostring'); 15 return 'a'; 16 }, 17 valueOf: function(){ 18 console.log('a valueof'); 19 return 1; 20 } 21 }; 22 console.log('' + a);
那么toString和valueOf分別什么時候調用呢?
原始類型(primitive value)包括以下幾類:null,undefined,string,number,boolean。
如果valueOf或toString返回非primitive value,它們將被忽略。如果都不存在或都不返回primitive value,則拋出TypeError: Cannot convert object to primitive value。
我現在的理解是先調用哪一個是由解釋器決定的,默認是先調用valueOf方法,但具體決定的規則我還不清楚。比如console.log(''+{})會先調用valueOf方法,如果valueOf方法返回的不是primitive value,再調用toString方法;console.log([{}].join(""))會先調用匿名對象的toString方法,如果toString方法返回的不是primitive value,再調用valueOf方法。
參考資料:
https://www.zhuwenlong.com/blog/article/5534ec4efd9753d106000002
http://www.cnblogs.com/imwtr/p/4392041.html
http://www.cnblogs.com/fybsp58/p/5683206.html
http://stackoverflow.com/questions/2485632/valueof-vs-tostring-in-javascript
