你真的会用parseInt方法吗?

  学习前端时间不短了,最早使用parseInt这个函数已经不记得具体时间了,在我的概念里对它的使用了解是parseInt(string, radix);把string转成数字,radix参数是把数字以多少进制表示出来,一直到今天我99.99%的情况使用场景都是radix等于10,而且也没出现过什么问题。但是最近遇到一个题目['1', '2', '3', '4', '5'].map(parseInt)我竟然不能很准确的写出正确答案。所以我今天要重新学习一下这个方法了,在认真研究这个方法的时候,还没有想象中的那么容易,下面先看一下这个方法的解释

 

radix取值范围每个具体的值对应关系是:

2 - [0, 1],3 - [0, 1, 2],10 - [0, 1, ..., 9],11 - [0, 1, ..., 9, a], 36 - [0, ..., a, ..., Z]

['1', '2', '3', '4', '5'].map(parseInt)相当于['1', '2', '3', '4', '5'].map((cur, index) => parseInt(cur, index));

cur和index的对应关系以及对结果的分析如下:

parseInt('1', 0); // 0 和 10相当于10进制

parseInt('2', 1); // 如果该参数小于2或者大于36,则 parseInt将返回 NaN

parseInt('3', 2); // 2进制的取值范围是0 1没有3,所以返回NaN

parseInt('4', 3); // 3进制的取值范围是0 1 2没有4,所以返回NaN

parseInt('5', 4); // 4进制的取值范围是0 1 2 3没有5,所以也返回NaN

其他情况:

parseInt('256', 3); // 3进制的取值范围是0 1 2没有56,所以返回2

parseInt('234', 5); // 5进制的取值范围是0 1 2 3 4,返回69

parseInt在确定被解析的值在radix取值的范围后,还会进行最后一步计算,计算规则如下

比如parseInt('234', 5);

2 * Math.pow(5, 2) + 3 * Math.pow(5, 1) + 4 * Math.pow(5, 0);  // 运行结果为69

参考链接https://www.cnblogs.com/webBlog-gqs/p/8727677.html

原文地址:https://www.cnblogs.com/typeof/p/12168571.html