還隱約記得被這同一問(wèn)題折磨了無(wú)數(shù)次后,無(wú)奈與痛下決心的心境。

首先我必須感謝那些即使這個(gè)問(wèn)題我強(qiáng)調(diào)過(guò)無(wú)數(shù)次,也依然反復(fù)重復(fù)類似錯(cuò)誤的人們。 沒(méi)有 " /> 可以在线看黄的网站,亚洲成熟xxxx,在线网站污

一区二区久久-一区二区三区www-一区二区三区久久-一区二区三区久久精品-麻豆国产一区二区在线观看-麻豆国产视频

javascript parseInt 大改造

還隱約記得得知了來(lái)龍去脈,為自己掌握了一個(gè)經(jīng)驗(yàn)而歡呼雀躍。

還隱約記得被這同一問(wèn)題折磨了無(wú)數(shù)次后,無(wú)奈與痛下決心的心境。

首先我必須感謝那些即使這個(gè)問(wèn)題我強(qiáng)調(diào)過(guò)無(wú)數(shù)次,也依然反復(fù)重復(fù)類似錯(cuò)誤的人們。
沒(méi)有他們反復(fù)犯錯(cuò)的鼓勵(lì),或許我不會(huì)認(rèn)真考慮這個(gè)問(wèn)題的解決方案。
其次,必須感謝《JavaScript高級(jí)程序設(shè)計(jì)》的作者和譯者。
在這里我得到了解決該問(wèn)題的啟示,不然我依然要每每強(qiáng)調(diào)使用parseInt時(shí)應(yīng)注意什么。


同時(shí),希望在這里不僅僅留下一個(gè)解決方案。
解決問(wèn)題的思路與想法,以及對(duì)問(wèn)題舉一反三的經(jīng)驗(yàn)在這里保留一下。

問(wèn)題:
很久以前發(fā)生的問(wèn)題不想再痛苦的回憶。
這次的問(wèn)題很簡(jiǎn)單。兩個(gè)月份比較的時(shí)候,因?yàn)樵路菔菑淖址谐槿〕鰜?lái)的, 于是用parseInt轉(zhuǎn)換了一下。
結(jié)果parseInt("08")之后結(jié)果是 0
原因請(qǐng)參看以下《JavaScript高級(jí)程序設(shè)計(jì)》19~20頁(yè)對(duì) parseInt函數(shù)的講解。

parseInt() 方法還有基模式,可以把二進(jìn)制、八進(jìn)制、十六進(jìn)制或其他任何進(jìn)制的字符串轉(zhuǎn)換成整數(shù)。
基是由 parseInt() 方法的第二個(gè)參數(shù)指定的,所以要解析十六進(jìn)制的值,需如下調(diào)用 parseInt() 方法:
復(fù)制代碼 代碼如下:
var iNum1 = parseInt("AF", 16); //返回 175

當(dāng)然,對(duì)二進(jìn)制、八進(jìn)制甚至十進(jìn)制(默認(rèn)模式),都可以這樣調(diào)用 parseInt() 方法:
復(fù)制代碼 代碼如下:
var iNum1 = parseInt("10", 2); //返回 2
var iNum2 = parseInt("10", 8); //返回 8
var iNum3 = parseInt("10", 10); //返回 10

如果十進(jìn)制數(shù)包含前導(dǎo) 0,那么最好采用基數(shù) 10,這樣才不會(huì)意外地得到八進(jìn)制的值。例如:

var iNum1 = parseInt("010"); //返回 8
var iNum2 = parseInt("010", 8); //返回 8
var iNum3 = parseInt("010", 10); //返回 10

在這段代碼中,兩行代碼都把字符 "010" 解析成一個(gè)數(shù)字。

第一行代碼把這個(gè)字符串看作八進(jìn)制的值,解析它的方式與第二行代碼(聲明基數(shù)為 8)相同。最后一行代碼聲明基數(shù)為 10,所以 iNum3 最后等于 10。

初試身手:
以前的解決方法是讓大家都拋棄 parseInt函數(shù),全部以parseFloat來(lái)替換。
但是作為人“孰能無(wú)忘”?
最好的辦法莫過(guò)于保留parseInt的“形”,廢了parseInt的“神”。
于是我想到了《JavaScript高級(jí)程序設(shè)計(jì)》87~88頁(yè)關(guān)于“重定義已有方法”的說(shuō)明。
3.6.2 重定義已有方法
就像能給已有的類定義新方法一樣,也可重定義已有的方法。
如前一章所述,函數(shù)名只是指向函數(shù)的指針,因此可以輕易地使它指向其他函數(shù)。如果修改了本地方法,如 toString() ,會(huì)出現(xiàn)什么情況呢?

Function.prototype.toString = function () {
return "Function code hidden";
}
前面代碼完全合法,運(yùn)行結(jié)果完全符合預(yù)期:
function sayHi () {
alert("你好!");
}
alert(sayHi.toString()); //輸出"Function code hidden"
也許你還記得,第 2 章中介紹過(guò) Function 的 toString() 方法通常輸出的是函數(shù)的源代碼。
覆蓋該方法,可以返回另一個(gè)字符串(在這個(gè)例子中,返回 "Function code hidden " )。
不過(guò), toString() 指向的原始函數(shù)怎樣了呢?它將被無(wú)用存儲(chǔ)單元回收程序回收,因?yàn)樗煌耆珡U棄了。
沒(méi)能夠恢復(fù)原始函數(shù)的辦法,所以在覆蓋原始方法前,存儲(chǔ)它的指針比較安全,以便以后的使用。
你甚至可能在某種情況下在新方法中調(diào)用原始方法:
Function.prototype.originalToString = Function.prtotype.toString;
Function.prototype.toString = function () {
if(this.originalToString().length >100) {
return "Function too leng to display."
} else {
return this.originalToString();
}  
在這段代碼中,第一行代碼把對(duì)當(dāng)前 toString() 方法的引

用保存在屬性 originalTo- String 中。然后用定制的方法覆蓋了 toString() 方法。
新方法將檢查該函數(shù)源代碼的長(zhǎng)度是否大于 100 。
如果是,就返回錯(cuò)誤消息,說(shuō)明該函數(shù)代碼太長(zhǎng),否則調(diào)用 originalToString() 方法,返回函數(shù)的源代碼。

根據(jù)這個(gè)例子,只要照葫蘆畫(huà)瓢寫(xiě)一行
Global.prototype.parseInt = Global.prototype.parseFloat;
那么 parseInt函數(shù)真的就變成徒有其表,肚子里面干的卻是parseFloat勾當(dāng)?shù)暮瘮?shù)了。
但是,同時(shí)一個(gè)致命的問(wèn)題點(diǎn)也擺在眼前。
那就是JavaScript中的Global對(duì)象,就跟神一樣, 只是個(gè)概念。
說(shuō)明請(qǐng)參見(jiàn)下面《JavaScript高級(jí)程序設(shè)計(jì)》70頁(yè)關(guān)于“內(nèi)置對(duì)象”的說(shuō)明。
Global對(duì)象是ECMAScript中最特別的對(duì)象,因?yàn)閷?shí)際上它根本不存在。
如果嘗試編寫(xiě)下面的代碼,將得到錯(cuò)誤:
var pointer = Global;
錯(cuò)誤消息顯示Global不是對(duì)象,但剛才不是說(shuō)Global是對(duì)象嗎?
沒(méi)錯(cuò)。這里需要理解的主要概念是,在ECMAScript中,不存在獨(dú)立的函數(shù),所有函數(shù)都必須是某個(gè)對(duì)象的方法。
本書(shū)前面介紹的函數(shù),如isNaN()、isFinite()、parseInt()和parseFloat()等,看起來(lái)都像獨(dú)立的函數(shù)。
實(shí)際上,它們都是Global對(duì)象的方法。

于是,上網(wǎng)大查怎樣獲取Global對(duì)象,或怎么使用Global.prototype來(lái)改變parseInt函數(shù)。
結(jié)果可想而知,神就是神,就連著名的“搜神網(wǎng)”Google也查不出來(lái)。
欲放棄之時(shí),果然應(yīng)了那句“死地而后生”。突然想到parseInt就像個(gè)全局函數(shù)一樣,根本不用什么對(duì)象調(diào)用。
那是不是說(shuō),只要把上面那句改成 parseInt = parseFloat;就可以了?
果然,神,無(wú)處不在!!! 好用了!!!


深度考究:
問(wèn)題基本上解決了。只有一點(diǎn)需要注意的,就是JavaScript加載出錯(cuò)的時(shí)候,后面的語(yǔ)句就不加載執(zhí)行了。
所以這句一定要放在第一句執(zhí)行。現(xiàn)在正好建一個(gè)JavaScript通用方法庫(kù),要求以后每個(gè)頁(yè)面必須引入該庫(kù)文件。
所以這一句放在該JavaScript通用方法庫(kù)的第一行,從此便可高枕無(wú)憂。
但是當(dāng)我在為該段代碼寫(xiě)注釋,特別是列舉如何應(yīng)用時(shí),發(fā)現(xiàn)如下代碼的問(wèn)題
alert(parseInt("010", 2)); //10
alert(parseInt("010", 8)); //10
alert(parseInt("010", 10)); //10
每一個(gè)處理的返回值都是10,也就是說(shuō)可以處理二進(jìn)制,八進(jìn)制,十六進(jìn)制的parseInt從此消失了。
如果說(shuō)單個(gè)參數(shù)的parseInt惹出了不少麻煩,我們對(duì)于沒(méi)有惹禍的兩個(gè)參數(shù)的parseInt還是希望保留其特異功能的。
于是需要進(jìn)一步的改進(jìn)。
那么就要根據(jù)使用parseInt函數(shù)時(shí),傳遞參數(shù)的個(gè)數(shù)來(lái)進(jìn)行判斷處理。
如果只有一個(gè)參數(shù),那么就調(diào)用parseFloat返回結(jié)果。
如果有兩個(gè)以上的參數(shù),那么就調(diào)用parseInt兩個(gè)參數(shù)的處理,返回結(jié)果。
這里判斷參數(shù)個(gè)數(shù)用到arguments對(duì)象,參見(jiàn)《JavaScript高級(jí)程序設(shè)計(jì)》53~54頁(yè)關(guān)于arguments對(duì)象的說(shuō)明。
在函數(shù)代碼中,使用特殊對(duì)象 arguments,開(kāi)發(fā)者無(wú)需明確指出參數(shù)名 ,就能訪問(wèn)它們。
例如,在函數(shù) sayHi() 中,第一個(gè)參數(shù)是 message。
用 arguments[0] 也可以訪問(wèn)這個(gè)值,即第一個(gè)參數(shù)的值(第一個(gè)參數(shù)位于位置 0,第二個(gè)參數(shù)位于位置 1,依此類推)。
因此,無(wú)需明確命名參數(shù),就可以重寫(xiě)函數(shù):
function sayHi() {
if (arguments[0] == "bye") {
return;
}
alert(arguments[0]);
}
于是就有了如下代碼:
originalparseInt = parseInt;
parseInt = function (){
if(arguments.length == 1){
return parseFloat(arguments[0]);
} else {
return originalparseInt(arguments[0], arguments[1]);
}
這段代碼里我們改造了parseInt,讓其通過(guò)參數(shù)個(gè)數(shù)的不同進(jìn)行不同的處理。
用一個(gè)新的變量originalparseInt保留了parseInt的原型。
這樣我們即便改造了parseInt,依然能通過(guò)保留的原型變量originalparseInt使用parseInt的原始功能。

返璞歸真:
代碼寫(xiě)到這本以為一切都OK了,卻被人說(shuō)徹底抹殺了parseInt函數(shù)對(duì)2進(jìn)制,8進(jìn)制的處理。
想想也是。處理的過(guò)于極端,只想著用parseFloat徹底替換掉討厭的parseInt函數(shù)。
如果我們正的用到2進(jìn)制或8進(jìn)制的數(shù)字轉(zhuǎn)換,還得用我們費(fèi)勁保留的parseInt函數(shù)的原型新變量originalparseInt。
其實(shí)我們的愿望很簡(jiǎn)單。
parseInt函數(shù)中只有一個(gè)參數(shù)的時(shí)候就想讓它簡(jiǎn)單的處理10進(jìn)制的轉(zhuǎn)換,別再因?yàn)槭孜坏?來(lái)產(chǎn)生一些頭疼的bug。
當(dāng)我們用到第二個(gè)參數(shù),想讓它處理2進(jìn)制,8進(jìn)制的時(shí)候,我還依然能用parseInt既存的功能。
于是有了下面最終的代碼:
考慮到j(luò)s文件體積的問(wèn)題,盡量減少代碼量。于是把 originalparseInt 換成了 $parseInt。
另外把超級(jí)長(zhǎng)的內(nèi)置對(duì)象名arguments直接換成了一個(gè)字母 a 這樣該對(duì)象用了4次節(jié)省的代碼量就非常可觀了。


舉一反三:
對(duì)parseInt函數(shù)的再造就完成了。
那么其實(shí)我們可以根據(jù)這次改造的經(jīng)驗(yàn),改造與parseInt具有類似的煩人特性的JavaScript方法。
譬如,escape,unescape這種已經(jīng)被 W3C組織不推薦使用的方法就可以用被推薦的方法替換掉

escape = encodeURI;
unescape = decodeURI;
那么基于這次的經(jīng)驗(yàn),今后遇到類似的問(wèn)題就可以考慮到用這種乾坤大挪移的方法去解決了。

JavaScript技術(shù)javascript parseInt 大改造,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 欧美一级高清片免费一级 | 国产综合精品一区二区 | 自愉自愉自产国产91 | 激情图片亚洲 | 国产桃色在线成免费视频 | 6699久久国产精品免费 | 草草线在成人免费视频 | 国产伦精品一区二区三区免费迷 | 成人影院203nnxyz | 激情视频小说图片 | 日韩经典欧美一区二区三区 | 国产成人亚洲精品91专区手机 | 久久国产精品99久久久久久老狼 | 亚洲一区二区三区高清 | 国产亚洲欧美一区二区三区 | 国产成人久久精品 | 日本人乱人乱亲乱色视频观看 | 伊人久久综合网亚洲 | 色久悠悠色久在线观看 | 亚洲线精品久久一区二区三区 | 五月伊人网 | 5566夜色| 欧美一欧美一区二三区性 | 91在线小视频 | 国产高清美女一级a毛片久久 | 国产igao激情在线观看 | 49pao强力在线高清基地 | 色综合国产 | 亚洲精品国产成人 | 国产精品19p | 六月婷婷精品视频在线观看 | 九九操视频| 一级寡妇乱色毛片全18 | 中文字幕在线观看一区二区三区 | 色婷婷中文字幕 | 国产日韩中文字幕 | 精品成人乱色一区二区 | 国产亚洲婷婷香蕉久久精品 | 国产永久在线视频 | 日韩成人av在线 | 成人在激情在线视频 |