JavaScript中valueOf、toString的隱式調用

來源:互聯網
上載者:User

JavaScript中valueOf、toString的隱式調用

今天在群上有人問這樣一個問題:

函數add可以實現連續的加法運算
函數add文法如下
add(num1)(num2)(num3)...;//注意這裡是省略符號喲,無限
使用舉例如下:
add(10)(10)=20;
add(10)(20)(50)=80;
add(10)(20)(50)(100)=180;
請用js代碼實現函數add。

自個琢磨了一會只能Google之,代碼如下:

 
  1. function add(num){ 
  2.         var sum=num, 
  3.          
  4.             tmp=function(v){ 
  5.                 sum+=v; 
  6.                 return tmp 
  7.             }; 
  8.          
  9.         tmp.toString=function(){ 
  10.             return sum 
  11.         }; 
  12.          
  13.         return tmp 
  14.     } 
  15.      
  16.      
  17.     alert( add(10)(20)(50) )        //80 

起初沒弄懂為什麼會返回80,因為toString方法一直沒被調用啊,怎麼會返回sum呢;後來知道原來toString被隱式調用了,也就有了下文。

先引用一段話:

每個對象的toString和valueOf方法都可以被改寫,每個對象執行完畢,如果被用以操作JavaScript解析器就會自動調用對象的toString或者valueOf方法,舉栗子:

 
  1. //我們先建立一個對象,並修改其toString和valueOf方法 
  2.     var obj={ 
  3.          
  4.         i:10, 
  5.          
  6.         valueOf:function(){ 
  7.              
  8.             console.log('執行了valueOf()'); 
  9.              
  10.             return this.i+20 
  11.              
  12.         }, 
  13.          
  14.         toString:function(){ 
  15.              
  16.             console.log('執行了toString()'); 
  17.              
  18.             return this.valueOf()+20 
  19.         } 
  20.     } 
  21.      
  22.     //當我們調用的時候: 
  23.      
  24.     alert( obj )    //50       執行了toString() 執行了valueOf() 
  25.     alert( +obj )    //30       執行了valueOf() 
  26.     alert( obj>40 )    //false       執行了valueOf() 
  27.     alert( obj==30 )    //true       執行了valueOf() 
  28.     alert( obj===30 )    //false 
  29.     //最後這個未輸出任何字串,個人猜想是這樣的:全等比較時,js解析器直接先判斷類型是否一樣,明顯一個是Object,一個是Number,所以直接不相等,根本不需要再去求值了。 

由上可以看出,雖然我們沒有調用obj的任何方法,但是要使用obj進行操作時,好像其實就是,如果我們是創造js解析器的人這些就不是問題了,哎)js解析器自動幫我們調用了其toString或valueOf方法。

接下來就是探究什麼時候執行的是toString方法,什麼時候執行的是valueOf方法了。大致猜這樣:如果做加減乘除、比較運算的時候執行的是valueOf方法,如果是需要具體值呢就執行的是toString方法。更嚴謹的實驗複製一下,請原諒原文地址):

 看到這裡,我們回顧一下之前我們使用 字串和數字加減 等操作的隱式轉換:

 
  1. var age = 30; 
  2. age.toString() + 'year old'; // '30 year old' 
  3. age + ' years old'; // '30 years old' 

在運行 age.toString() + 'year old'時,age變數通過調用toString函數顯式的從Number型轉換成String型。而在運行age + ' years old'時,我們沒有顯式的調用函數,age也被轉換成String型,這裡就是javascript引擎做了隱式類型轉換。隱式類型轉換可以認為 javascript引擎調用的相應的類型轉換函式來進行類型轉換,age + ' years old'其實等價於age.toString() + 'years old',隱式類型轉換和顯式類型轉換其實是一回事情當然,具體怎麼優秀的做隱式轉換的還是造js解析器的人最清楚,他怎麼不告訴我們怎麼造的呢... (☆▽☆)...這樣的遊戲好玩麼)。
哈哈,其實就是之前沒對隱式類型轉換做深入研究,只知道,哦是這樣,隱式類型轉換嘛。所以換個上面add函數的形式就不知道是怎麼回事了,不過現在算是弄清楚了吧)。

參考:

http://www.cnblogs.com/rubylouvre/archive/2010/10/01/1839748.html

http://zjuwwq.gitbooks.io/jump_javascript/content/data_types/type_conversion.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.