JS 物件toString 和 valueof 方法
js物件tostring和valueof方法
所有物件繼承了Object.prototype的兩個轉換方法:
第一個是toString(),它的作用是返回一個反映這個物件的字串;
第二個是valueOf(),它的作用是返回它相應的原始值;
但一些內建物件重寫了這兩個方法,下面展示了一些內建物件呼叫這兩個方法的返回情況。
型別 | toString | valueOf |
Object | 返回"[object ObjectName]",其中 ObjectName 是物件型別的名稱。 | 物件本身。這是預設情況。 |
String | 返回 String 物件的值 | 字串值。 |
Number | 返回數值的字串表示。還可返回以指定進製表示的字串,請參考 |
數字值。 |
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