相信大家都見過這樣一道經(jīng)典的面試題宦言,如下:
let arr = [10.18,0,15,23];
arr = arr.map(parseInt);
console.log(arr);
首先解這道題之前蔽氨,我們先來了解一下parseInt和parseFloat是干什么的玉雾。
parseInt和parseFloat都是解析一個(gè)字符串融师,并返回一個(gè)整數(shù)右钾。從字符串左側(cè)開始查找有效數(shù)字字符,如果遇到非有效數(shù)字則停止查找旱爆,如果開始就不是有效數(shù)字舀射,直接返回NAN。
parseInt語法
parseInt(value,radix) 它是解析一個(gè)字符串并返回指定基數(shù)(進(jìn)制)的十進(jìn)制數(shù)怀伦,radix表示被解析的字符串的基數(shù)脆烟,通俗點(diǎn)說就是把value看成[radix]進(jìn)制的數(shù),然后轉(zhuǎn)換成十進(jìn)制空镜。如果radix默認(rèn)不寫浩淘,則默認(rèn)表示為10進(jìn)制捌朴,特殊情況下吴攒,以ox開頭,代表16進(jìn)制砂蔽。
radix是在2~36之間的整數(shù)洼怔,如果不在這個(gè)區(qū)間,則返回NAN(除了0,和10是一個(gè)意思左驾,代表十進(jìn)制)镣隶。
說了這么多,直接上??大家就應(yīng)該明白了:
parseInt(10,0) //10
parseInt(13,3) //1
parseInt('24px',5) //14
parseInt(6,1)//NAN
來詳細(xì)解答一下诡右,parseInt(10,0)安岂,顯然0代表十進(jìn)制,所以答案為10帆吻,這個(gè)就沒什么好說的了域那;
parseInt(13,3) ,將13看為三進(jìn)制的數(shù),轉(zhuǎn)為十進(jìn)制數(shù)猜煮,(幾進(jìn)制就是逢幾就進(jìn)位次员,如三進(jìn)制是逢3就進(jìn)位,所以里面不能有3或者比3大的數(shù))王带,從左往右開始查找淑蔚,這里1是有效三進(jìn)制數(shù)字,3不是愕撰,運(yùn)算公式為1*3^0 = 1刹衫,所以parseInt(13,3)結(jié)果為1醋寝;
parseInt('24px',5),按照上述計(jì)算带迟,從左往右查找甥桂,2和4都是有效的5進(jìn)制數(shù),找到p為非有效數(shù)字邮旷,停止查找黄选,4為第0位,2為第一位婶肩,運(yùn)算公式:2 * 5^1+4 * 5^0 = 14,所以parseInt('24px',5)答案為14办陷;
parseInt(6,1),顯然1不在2~36之間律歼,所以返回NAN民镜。
好了,了解了parseInt的語法险毁,那我們就思考一下文章一開始我們看到的那道面試題吧制圈,arr.map(parseInt),這里面,我們需要了解兩個(gè)知識(shí)點(diǎn)畔况,第一個(gè)map的語法鲸鹦,arr.map(function callback(currentValue[, index[, array]]) {}[, thisArg])
map里的函數(shù)會(huì)傳遞3個(gè)參數(shù),分別是當(dāng)前元素值跷跪,索引馋嗜,和方法調(diào)用的數(shù)組,所以arr.map(parseInt)
可以寫成arr.map((item,index)=>{parseInt(item,index)})
來求解吵瞻,第二個(gè)知識(shí)點(diǎn)就是parseInt的語法定義葛菇,上面我們已經(jīng)了解過了parseInt具體怎么解,這里我們直接可以把題簡化成parseInt(10.18,0),parseInt(0,1),parseInt(15,2),parseInt(23,3)
答案為10橡羞,NAN眯停,1,2
OK卿泽,現(xiàn)在再看這道題 是不是很簡單咯~
說完parseInt莺债,這里再說一下parseFloat吧,
parseFloat語法
parseFloat()函數(shù)解析一個(gè)參數(shù)(必要時(shí)先轉(zhuǎn)換為字符串)并返回一個(gè)浮點(diǎn)數(shù)又厉。它和parseInt的主要區(qū)別在于默認(rèn)只傳一個(gè)值的時(shí)候九府,parseFloat可以多識(shí)別一個(gè)小數(shù)點(diǎn)。
如parseFloat(10.1) //10.1
,另外parseInt支持進(jìn)制基數(shù)覆致,能夠把值看做這個(gè)進(jìn)制然后轉(zhuǎn)換為十進(jìn)制侄旬,而parseFloat不支持。
最后說一下和Number()的區(qū)別煌妈,Number()也是轉(zhuǎn)換數(shù)字字符串為數(shù)字儡羔,但是字符串必須保證都是有效數(shù)字才會(huì)轉(zhuǎn)換為數(shù)字宣羊,不然返回NAN,例如
Number('12px') //NAN
Number('12.3') // 12.3
Number('12.00') // 12
Number('123e-1') // 12.3
Number('') // 0
Number(null) // 0
Number('0x11') // 17
Number('0b11') // 3
Number('0o11') // 9
Number('foo') // NaN
Number('100a') // NaN
Number('-Infinity') //-Infinity
好了汰蜘,看完之后是不是豁然開朗咯~~ 今天就到這里吧 ~~