摘要:前言原由偶然看到一個(gè)略微奇妙的代碼初看之時(shí),瞬間得出答案雖然心底有些許疑問的聲音因此追溯根源,沒想到答案讓我驚呼這里黑人問號(hào),手動(dòng)滑稽查詢了等文檔,因此得出下文結(jié)論,由于英語(yǔ)渣渣,所以有不恰當(dāng)?shù)牡胤较M魑粠兔Ω瘮?shù)是核心的一個(gè)全局函數(shù)
前言
原由:parseInt函數(shù)
偶然看到一個(gè)略微奇妙的代碼["1", "2", "3"].map(parseInt)
初看之時(shí),瞬間得出答案[1, 2, 3](雖然心底有些許疑問的聲音~)
因此追溯根源,沒想到答案讓我驚呼WTF?(這里黑人問號(hào),手動(dòng)滑稽)
查詢了MDN、Standard ECMA-262等文檔,因此得出下文結(jié)論,由于英語(yǔ)渣渣,所以有不恰當(dāng)?shù)牡胤较M魑粠兔Ω齸
parseInt是ECMAScript核心的一個(gè)全局函數(shù),可以在實(shí)現(xiàn)了ECMAScript的宿主環(huán)境全局調(diào)用
廢話不多說(shuō),下面就是探討parseInt函數(shù)的正文:
MDN查詢得知 -> parseInt(string, [int radix])
是的,parseInt函數(shù)其實(shí)有兩個(gè)形式參數(shù),正是因?yàn)槲矣浀眠@一點(diǎn)才催生了我前文提到的疑問和導(dǎo)致這篇科普文的誕生
相信,很多人都使用過parseInt函數(shù)傳遞一個(gè)形式參數(shù)的時(shí)候,這很簡(jiǎn)單嘛,不就是把字符串轉(zhuǎn)換成Int32類型的整數(shù)?
沒毛病,老鐵雙擊666~
console.log(parseInt("12")); console.log(parseInt("08")); console.log(parseInt("0x16")); console.log(parseInt("-12")); console.log(parseInt(" -12")); console.log(parseInt(" - 12")); console.log(parseInt("124ref")); console.log(parseInt("ref"));
以上幾乎就是parseInt函數(shù)一個(gè)形式參數(shù)時(shí)的所有情況,那么結(jié)果都是啥呢?希望大家手動(dòng)執(zhí)行下代碼:)手動(dòng)滑稽
其中,要特殊注意的就08、0x16、 - 12
首先呢,有人看到我說(shuō)要特殊注意的第一個(gè)字符串的時(shí)候,可能心里會(huì)暗想(up主4不4傻),這么簡(jiǎn)單有需要注意的?
其實(shí)呢,我也是google了一下關(guān)于parseInt函數(shù)的中文博文(嗯,是的沒錯(cuò)(/▽\)),發(fā)現(xiàn)了一個(gè)奇怪的事情 -> 傳送門
這篇博文的up主說(shuō)parseInt("08")的結(jié)果得不到8,我默默地打開Chrome的devTool,一跑發(fā)現(xiàn)沒毛病啊!!!看了一下博文的時(shí)間是2010年,因此推斷是ECMAScript標(biāo)準(zhǔn)作祟,如果不是那我也就...(攤手~)
ox16這個(gè)特殊注意點(diǎn)呢,也很平常其實(shí),就是16進(jìn)制前綴嘛,看過Javascript權(quán)威指南的都懂,沒了解過的呢看我看我來(lái)說(shuō)FreeStyle...parseInt傳遞的第一個(gè)形式參數(shù)是字符串類型的,底層實(shí)現(xiàn)會(huì)先識(shí)別該字符串時(shí)候是否有0x或者0X前綴,如果有呢,第二個(gè)形式參數(shù)(radix)就會(huì)被賦值為16,也就是十六進(jìn)制,然后parseInt再把這個(gè)十六進(jìn)制轉(zhuǎn)換為十進(jìn)制Number類型
- 12,這個(gè)就更為簡(jiǎn)單點(diǎn)啦,就是識(shí)別有沒有負(fù)號(hào)前綴,有的話會(huì)轉(zhuǎn)換成負(fù)整數(shù)。但是有一點(diǎn)注意的是空格,空格出現(xiàn)在parseInt函數(shù)的string形參最前面和最后面都會(huì)被忽略,然而出現(xiàn)在特殊前綴(英文翻譯為code unit)0x或0X和-就會(huì)有問題,parseInt無(wú)法進(jìn)行轉(zhuǎn)換返回NaN
兩個(gè)形式參數(shù)那么重頭戲來(lái)了,這篇科普文的精髓部分,不要睡著啊~老鐵
parseInt(string, [int radix])第二個(gè)形參是可以忽略的,忽略時(shí)默認(rèn)賦值為10也就是十進(jìn)制
radix就是指定第一個(gè)形參的進(jìn)制類型,然后根據(jù)這個(gè)進(jìn)制類型再轉(zhuǎn)換為十進(jìn)制整數(shù)(敲黑板~)
radix形參沒指定的時(shí)候是10,其次他是具有有效范圍滴:[2, 36]和特殊值0
下面是英語(yǔ)渣渣的我翻譯后,簡(jiǎn)化的parseInt執(zhí)行步驟:(ECMAScript原解析->傳送門)
將第一個(gè)形參轉(zhuǎn)換為字符串
識(shí)別string轉(zhuǎn)換是否有code unit,如果有 -> -標(biāo)記為負(fù)數(shù),0x或0X則把radix賦值為16
radix形參(int類型)是否存在,存在則重新賦值(會(huì)對(duì)實(shí)參進(jìn)行Int32轉(zhuǎn)化,無(wú)法轉(zhuǎn)換成int類型則不會(huì)重新賦值radix)
radix為0,則設(shè)置radix為默認(rèn)值10
如果radix為1,或者大于等于37,parseInt直接返回NaN
如果radix為[2, 36]時(shí)則代表,string參數(shù)分別是二進(jìn)制,三進(jìn)制(如果有得話~)...三十六進(jìn)制類型
然后對(duì)string進(jìn)行的radix進(jìn)制 -> 十進(jìn)制轉(zhuǎn)換
以上就是parseInt轉(zhuǎn)換時(shí)的步驟,那么我們來(lái)開始解釋["1", "2", "3"].map(parseInt)
at first, 答案是[1, NaN, NaN]
(function (){ var ret = ["1", "2", "3"].map((value, index)=>{ console.log(value, index); return parseInt(value, index); }); console.log(ret); })();
這是["1", "2", "3"].map(parseInt)內(nèi)部執(zhí)行的剖析,value和index相信大家都懂,不懂請(qǐng)自行MDN,執(zhí)行步驟為:
value="1",index=0 -> parseInt(value, index)
value="2",index=1 -> parseInt(value, index)
value="3",index=2 -> parseInt(value, index)
抽離出來(lái),其實(shí)就是
parseInt("1", 0); parseInt("2", 1); parseInt("3", 2);
按照我前面分析的parseInt轉(zhuǎn)換步驟,可以很輕易的得出前面兩個(gè)的答案,那么第三個(gè)呢?手動(dòng)滑稽、黑人問號(hào)...哈哈
其實(shí),也很簡(jiǎn)單啦,parseInt("3", 2)這是根據(jù)二進(jìn)制對(duì)字符串3進(jìn)行十進(jìn)制轉(zhuǎn)換對(duì)吧!!!
exm???有毛病?沒毛病,老鐵,就是......你家二進(jìn)制有3?二進(jìn)制不就是0和1啊
就是0和1啊
是0和1啊
0和1啊
和1啊
1啊
啊
因此返回NaN,666
parseInt("13", 2),這個(gè)結(jié)果是......1,因?yàn)閟tring參數(shù)如果最開始的code符合radix進(jìn)制的話是可以進(jìn)行解析轉(zhuǎn)換的,正如這里"1"是符合二進(jìn)制的,"3"是不符合二進(jìn)制的,但1處于優(yōu)先位置,所以可以進(jìn)行轉(zhuǎn)換解析,而3被無(wú)情地忽略~
Lastly,我們來(lái)動(dòng)手一下吧:)parseInt("9", 8); parseInt("0x16", 10); parseInt("-10", 16); parseInt("5/8/2017", "javascript is such funny");后記
這只是一篇科普文,大家relaxed一下,畢竟世界竟如此好玩~最后不喜勿噴,歡迎大家指出不足和錯(cuò)誤的地方,感謝閱讀參考文獻(xiàn)
MDN
Standard ECMA-262
圖解進(jìn)制轉(zhuǎn)換
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/84680.html
摘要:我們可以用測(cè)一下具體實(shí)現(xiàn)原理,請(qǐng)參考文檔注意因?yàn)椴僮鲗⒉僮鲾?shù)轉(zhuǎn)為,所以它不能處理超過位的數(shù)值取整,而有效整數(shù)的范圍是位。綜上所以如果要考慮壓縮代碼的大小,且明確知道數(shù)值范圍不會(huì)超過位整數(shù)的時(shí)候,可以考慮使用取整。 在處理數(shù)值的時(shí)候,獲取浮點(diǎn)數(shù)的整數(shù)和小數(shù)部分,是一種常見的操作,在JavaScript中有許多方法可以達(dá)到目的,但也正因?yàn)榉椒ū姸啵阅姆N方法更好,也值得我們仔細(xì)研究一番。...
摘要:例如注意字符串中的負(fù)十六進(jìn)制數(shù)字是一個(gè)特殊情況,如果你用解析,結(jié)果是不正確的。轉(zhuǎn)換十六進(jìn)制數(shù)時(shí)要小心,如果你不知道要轉(zhuǎn)換對(duì)象的類型,不要使用。字符串轉(zhuǎn)換為數(shù)字的方式總結(jié)負(fù)十六進(jìn)制數(shù)字符串轉(zhuǎn)換為數(shù)字時(shí)。 摘要 :JavaScript 是一個(gè)神奇的語(yǔ)言,字符串轉(zhuǎn)數(shù)字有 5 種方法,各有各的坑法! 原文: Converting Strings to Number in Javascript...
摘要:字符串中的負(fù)十六進(jìn)制數(shù)字是一個(gè)特殊情況,如果你用解析,結(jié)果是不正確的。按位非可以把字符串轉(zhuǎn)換成整數(shù),但他不是浮點(diǎn)數(shù)。如果是一個(gè)字符串轉(zhuǎn)換,它將返回這是什么原理通過翻轉(zhuǎn)每個(gè)位,也稱為數(shù)字的補(bǔ)碼。 String轉(zhuǎn)換為Number有很多種方式,我可以想到的有5種!但總有一些情況讓人猝不及防,總結(jié)到這里供自己日后查找方便 parseInt 根據(jù)JsPerf.com的基準(zhǔn)測(cè)試,大多數(shù)瀏覽器對(duì)pa...
摘要:轉(zhuǎn)換為字符串規(guī)則如下圖代碼大致就是普通其他基本類型轉(zhuǎn)為字符串的話,就直接轉(zhuǎn)為其值的字符串表達(dá)形式,如果是基本類型的封裝對(duì)象,會(huì)先拆封,然后再轉(zhuǎn)為字符串,如果是普通對(duì)象,則會(huì)調(diào)用其內(nèi)部的值,如果是極大數(shù)和級(jí)小數(shù),將會(huì)進(jìn)行一些轉(zhuǎn)化,具體規(guī) 轉(zhuǎn)換為字符串規(guī)則如下圖代碼: console.log(String(undefined)); // undefined console.log(Str...
摘要:中有很多奇妙的東西,歸咎歸功于設(shè)計(jì)時(shí)候的迅速。缺陷有,但是的強(qiáng)大確實(shí)體現(xiàn)的淋漓盡致。它是如此的靈活,當(dāng)然隨之而來(lái)的便是開發(fā)的代價(jià),它不像強(qiáng)類型語(yǔ)言那樣規(guī)規(guī)矩矩。難得周末晚上清閑,回味這些看起來(lái)有點(diǎn)怪怪卻又在發(fā)生著的問題。 JavaScript中有很多奇妙的東西,歸咎or歸功于設(shè)計(jì)時(shí)候的迅速。缺陷有,但是JavaScript的強(qiáng)大確實(shí)體現(xiàn)的淋漓盡致。 它是如此的靈活,當(dāng)然隨之而來(lái)的便是開...
閱讀 727·2021-11-24 10:30
閱讀 1261·2021-09-24 09:48
閱讀 3079·2021-09-24 09:47
閱讀 3598·2019-08-29 17:11
閱讀 2880·2019-08-29 15:38
閱讀 2277·2019-08-29 11:03
閱讀 3599·2019-08-26 12:15
閱讀 1015·2019-08-26 10:45