相信大家都见过这样一道经典的面试题,如下:
let arr = [10.18,0,15,23];
arr = arr.map(parseInt);
console.log(arr);
首先解这道题之前,我们先来了解一下parseInt和parseFloat是干什么的。
parseInt和parseFloat都是解析一个字符串,并返回一个整数。从字符串左侧开始查找有效数字字符,如果遇到非有效数字则停止查找,如果开始就不是有效数字,直接返回NAN。
parseInt语法
parseInt(value,radix) 它是解析一个字符串并返回指定基数(进制)的十进制数,radix表示被解析的字符串的基数,通俗点说就是把value看成[radix]进制的数,然后转换成十进制。如果radix默认不写,则默认表示为10进制,特殊情况下,以ox开头,代表16进制。
radix是在2~36之间的整数,如果不在这个区间,则返回NAN(除了0,和10是一个意思,代表十进制)。
说了这么多,直接上🌰大家就应该明白了:
parseInt(10,0) //10
parseInt(13,3) //1
parseInt('24px',5) //14
parseInt(6,1)//NAN
来详细解答一下,parseInt(10,0),显然0代表十进制,所以答案为10,这个就没什么好说的了;
parseInt(13,3) ,将13看为三进制的数,转为十进制数,(几进制就是逢几就进位,如三进制是逢3就进位,所以里面不能有3或者比3大的数),从左往右开始查找,这里1是有效三进制数字,3不是,运算公式为1*3^0 = 1,所以parseInt(13,3)结果为1;
parseInt('24px',5),按照上述计算,从左往右查找,2和4都是有效的5进制数,找到p为非有效数字,停止查找,4为第0位,2为第一位,运算公式:25^1+25^0 = 14,所以parseInt('24px',5)答案为14;
parseInt(6,1),显然1不在2~36之间,所以返回NAN。
好了,了解了parseInt的语法,那我们就思考一下文章一开始我们看到的那道面试题吧,arr.map(parseInt),这里面,我们需要了解两个知识点,第一个map的语法,arr.map(function callback(currentValue[, index[, array]]) {}[, thisArg])
map里的函数会传递3个参数,分别是当前元素值,索引,和方法调用的数组,所以arr.map(parseInt)
可以写成arr.map((item,index)=>{parseInt(item,index)})
来求解,第二个知识点就是parseInt的语法定义,上面我们已经了解过了parseInt具体怎么解,这里我们直接可以把题简化成parseInt(10.18,0),parseInt(0,1),parseInt(15,2),parseInt(23,3)
答案为10,NAN,1,2
OK,现在再看这道题 是不是很简单咯~
说完parseInt,这里再说一下parseFloat吧,
parseFloat语法
parseFloat()函数解析一个参数(必要时先转换为字符串)并返回一个浮点数。它和parseInt的主要区别在于默认只传一个值的时候,parseFloat可以多识别一个小数点。
如parseFloat(10.1) //10.1
,另外parseInt支持进制基数,能够把值看做这个进制然后转换为十进制,而parseFloat不支持。
最后说一下和Number()的区别,Number()也是转换数字字符串为数字,但是字符串必须保证都是有效数字才会转换为数字,不然返回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
好了,看完之后是不是豁然开朗咯~~ 今天就到这里吧 ~~
网友评论