標籤:error date undefined text color turn 數值 rip logs
所有對象繼承了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
js對象tostring和valueof方法