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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM