原来parseInt还可以这样用啊

581 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第25天,点击查看活动详情

一直以为parseInt和parseFloat的用法一样,都是解析一个字符串,区别就是前者返回一个整数,后者返回一个浮点数。直到碰到了数组结合map和parseInt()函数这道题,才仔细看了一下parseInt的api。

题目

const arr = [2.2, 4.55, 16, 23, 12.43];
const arr1 = arr.map(parseInt)
求arr1;

当我第一次看到结果竟然是[ 2, NaN, 1, 2, 6 ]这个的时候,我一下子都懵了,这也确实反映出基础不牢固,api了解的不清楚。不过还好,计算机是不会骗人的。那么就开始捋一下为什么是这个结果吧?

解题

  1. map大家相对都是比较熟悉的,它是数组的一个方法,用法如下
array.map(function(currentValue,index,arr), thisValue)

map的参数有两个,第一个是一个函数(必选),第二个参数是作为第一个参数中的this使用,而我们都知道parseInt是一个函数,在题目中可以看到map并没有传递第二个参数,那么这道题和预期(将数组中所有元素转化为整数)不符,问题只能出现在parseInt这个函数上

2.parseInt在打开链接后,一下就发现了问题,原来parseInt是可以传递第二个参数的

parseInt(string, radix)

其中radix表示要解析的数字的基数。该值介于 2 ~ 36 之间。基数就是多少进制,比如10进制,2进制等。

既然发现了问题所在,那么就可以根据现有的条件进行解题了

  1. 题目转化 这道题目相当于对每一个元素进行修改
    tips:radix为0,相当于10,其他不在范围内的都返回NaN
arr1[0] = parseInt(arr[0],0);//2
arr1[1] = parseInt(arr[1],1);//NaN
arr1[2] = parseInt(arr[2],2);
arr1[3] = parseInt(arr[3],3);
arr1[4] = parseInt(arr[4],4);

本以为转换后能轻易得出结果,但是这里又遇到了问题,如何将其他进制的数字转换为十进制的数字呢?

  1. 进制转化 将其他进制的数字转化为十进制的数字,就有涉及到一个 进制转化方法 ,根据进制转化的方法,可以进行计算。
arr1[2] = parseInt(16,2);
arr1[3] = parseInt(23,3);
arr1[4] = parseInt(12.43,4);

其中parseInt(16,2)中的“6”不符合二进制,parseInt(23,3)中的“3”不符合三进制,parseInt(12.43,4)中的“4”不符合四进制,将其转化为

arr1[2] = parseInt('1',2);
arr1[3] = parseInt('2',3);
arr1[4] = parseInt('12.',4);

进而得出结果

arr1[2] = 1;
arr1[3] = 2;
arr1[4] = 6;

tips:这里计算不太清楚的,可以考虑一下位权值,不同进制中不同数位的权重值是不一样的,个十百千万分别对应0,1,2,3,4.小数点后放则对应-1,-2...

总结

题目中考察的东西比较基础,但是一不注意就会出现错误。如果不了解parseInt的api真的搞不懂这道题目,而且还涉及到了进制的转化,虽然实际生产中并没有遇到过,但也给我提了个醒,一定要注意这些api的使用,别太想当然。为此还特意再次查看了一下parseFloat的api,和记忆中一样,只能传递一个参数。