成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

JavaScript中valueOf、toString的隱式調(diào)用

開(kāi)發(fā) 前端
今天在群上有人問(wèn)這樣一個(gè)問(wèn)題

今天在群上有人問(wèn)這樣一個(gè)問(wèn)題:

函數(shù)add可以實(shí)現(xiàn)連續(xù)的加法運(yùn)算
函數(shù)add語(yǔ)法如下
add(num1)(num2)(num3)...;//注意這里是省略號(hào)喲,***
使用舉例如下:
add(10)(10)=20;
add(10)(20)(50)=80;
add(10)(20)(50)(100)=180;
請(qǐng)用js代碼實(shí)現(xiàn)函數(shù)add。

自個(gè)琢磨了一會(huì)只能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 

起初沒(méi)弄懂為什么會(huì)返回80,因?yàn)閠oString方法一直沒(méi)被調(diào)用啊,怎么會(huì)返回sum呢;后來(lái)知道原來(lái)toString被隱式調(diào)用了,也就有了下文。

先引用一段話

 

每個(gè)對(duì)象的toString和valueOf方法都可以被改寫,每個(gè)對(duì)象執(zhí)行完畢,如果被用以操作JavaScript解析器就會(huì)自動(dòng)調(diào)用對(duì)象的toString或者valueOf方法,舉栗子:

 

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

由上可以看出,雖然我們沒(méi)有調(diào)用obj的任何方法,但是要使用obj進(jìn)行操作時(shí),好像(其實(shí)就是,如果我們是創(chuàng)造js解析器的人這些就不是問(wèn)題了,哎)js解析器自動(dòng)幫我們調(diào)用了其toString或valueOf方法。

接下來(lái)就是探究什么時(shí)候執(zhí)行的是toString方法,什么時(shí)候執(zhí)行的是valueOf方法了。大致猜這樣:如果做加減乘除、比較運(yùn)算的時(shí)候執(zhí)行的是valueOf方法,如果是需要具體值呢就執(zhí)行的是toString方法。更嚴(yán)謹(jǐn)?shù)膶?shí)驗(yàn)復(fù)制一下,請(qǐng)?jiān)彛?a target="_blank" >原文地址):

 看到這里,我們回顧一下之前我們使用 字符串和數(shù)字加減 等操作的隱式轉(zhuǎn)換:

 

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

在運(yùn)行 age.toString() + 'year old'時(shí),age變量通過(guò)調(diào)用toString函數(shù)顯式的從Number型轉(zhuǎn)換成String型。而在運(yùn)行age + ' years old'時(shí),我們沒(méi)有顯式的調(diào)用函數(shù),age也被轉(zhuǎn)換成String型,這里就是javascript引擎做了隱式類型轉(zhuǎn)換。隱式類型轉(zhuǎn)換可以認(rèn)為 javascript引擎調(diào)用的相應(yīng)的類型轉(zhuǎn)換函數(shù)來(lái)進(jìn)行類型轉(zhuǎn)換,age + ' years old'其實(shí)等價(jià)于age.toString() + 'years old',隱式類型轉(zhuǎn)換和顯式類型轉(zhuǎn)換其實(shí)是一回事情(當(dāng)然,具體怎么優(yōu)秀的做隱式轉(zhuǎn)換的還是造js解析器的人最清楚,他怎么不告訴我們?cè)趺丛斓哪?.. (☆▽☆)...這樣的游戲好玩么[[137874]])。
哈哈,其實(shí)就是之前沒(méi)對(duì)隱式類型轉(zhuǎn)換做深入研究,只知道,哦是這樣,隱式類型轉(zhuǎn)換嘛。所以換個(gè)上面add函數(shù)的形式就不知道是怎么回事了,不過(guò)現(xiàn)在算是弄清楚了(吧)。

參考:

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

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

責(zé)任編輯:王雪燕 來(lái)源: 博客園
相關(guān)推薦

2023-12-05 08:18:51

函數(shù)valueOf

2010-01-07 17:42:23

Linux動(dòng)態(tài)庫(kù)

2023-08-14 08:35:36

2010-11-16 15:11:52

Oracle隱式游標(biāo)

2017-09-13 10:58:51

JavaScript轉(zhuǎn)換規(guī)則

2017-09-05 16:17:35

JavaScript運(yùn)算轉(zhuǎn)換

2023-09-22 09:04:00

C++編程

2010-06-22 13:32:26

函數(shù)式編程JavaScript

2023-12-12 08:50:22

MySQL隱式轉(zhuǎn)換varchar

2019-07-23 15:04:54

JavaScript調(diào)用棧事件循環(huán)

2020-09-25 15:40:22

toStringvalueOf前端

2009-07-20 17:59:07

JavaScript調(diào)ASP.NET AJA

2009-07-21 13:54:55

Scala重載方法隱式轉(zhuǎn)換

2024-08-28 08:50:11

MySQL核心模塊

2022-02-23 21:24:21

索引SQL字符

2017-07-28 09:39:12

隱式IntentAndroid M

2010-07-30 12:56:02

Flex調(diào)用JavaS

2009-09-01 10:49:28

C#具有隱式類型聲明

2009-09-04 10:49:19

C#隱式轉(zhuǎn)換

2009-09-11 10:07:05

Linq隱式類型化局部
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: www.一级片 | 欧美日韩中文字幕 | 久久国产精品72免费观看 | 亚洲香蕉 | 在线观看中文字幕av | 精品在线播放 | 中文字幕精品一区二区三区精品 | 国产成人jvid在线播放 | 亚洲女人的天堂 | 九九久久国产 | 最新一级毛片 | 99精品一区二区三区 | www.婷婷 | 91久久久久久久久久久久久 | 黄色片视频 | 国产欧美在线观看 | 亚洲精品久久久久久久久久久久久 | 国产精品一区久久久 | 久久精彩视频 | 黄色亚洲网站 | 国产成人综合一区二区三区 | 在线视频一区二区三区 | 国产精品人人做人人爽 | 一呦二呦三呦国产精品 | zzzwww在线看片免费 | 人人种亚洲 | 在线 丝袜 欧美 日韩 制服 | 国产欧美一区二区三区在线看蜜臀 | 亚洲国产网址 | 精品无码久久久久久久动漫 | 欧美一区2区三区4区公司二百 | 超碰3| 欧美日韩一区二区三区视频 | 精品国产黄a∨片高清在线 www.一级片 国产欧美日韩综合精品一区二区 | 精品久久不卡 | 9999视频| 亚洲成人日韩 | 国产免费麻豆视频 | 国产一二三区精品视频 | 麻豆精品国产免费 | 国产高清在线精品一区二区三区 |