1. 程式人生 > 實用技巧 >JS 物件toString 和 valueof 方法

JS 物件toString 和 valueof 方法

js物件tostring和valueof方法

所有物件繼承了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。

如果valueOftoString返回非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