parseInt的细节知识
2020-09-26 本文已影响0人
羽晞yose
parseInt经典面试题
let arr = [1, 2, 3, 4]
arr.map(parseInt) // 写出输出结果
parseInt语法
parseInt(string, radix)
string 必需。要被解析的字符串。
radix 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。
第二个值有两个特征:
- 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
- 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN
要解答上述面试题,需了解两个知识点:
- 该方法传入参数具体规则
- 当只有一个参数时,规则如下:
parse([value]): 把value转换为数字,要求value是字符串,如果不是字符串先默认转换为字符串。该方法从字符串左边开始查找,找到有效数字字符转换为数字,如果遇到一个非有效数字字符,则停止查找 - 当传入两个参数时,规则如下:
parseInt([value], [radix]): 第一个参数遵循上述规则,第二个参数指定第一个参数的进制,该方法输出结果为10进制数字
- 不同进制转换为10进制规则
- 不同进制转换为10进制,其结果为每一位有效数字*N进制的(阶乘,实在没找到什么描述起来清楚易懂的)
以parseInt('2AF5', 16)
为例,没有超过16的数字,那么每一位都是有效数字,所以计算结果为
2*16³ + 10*16² + 15*16¹ + 5*16º
2*16*16*16 + 10*16*16 + 15*16 + 5*1 = 10997
- 如果存在非有效进制数字(例如二进制数字当中存在大于1的数字),则不再继续查找。如果第一个数字已经不是有效的转换进制数字,则返回结果为NaN(因为查找不到,所以结果为
parseInt(undefined, 2)
)
例如parseInt('103', 2)
,因为3不是有效转换数字了,所以结果为parseInt('10', 2) => 1 * 2 + 0 * 1 => 2
因此上面的经典面试题转换后变成以下四句
// 如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数
parseInt(1, 0) => 1
// 如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN
parseInt(2, 1) => NaN
// 3不是有效的2进制数字
parseInt(3, 2) => NaN
// 4不是有效的3进制数字
parseInt(4, 3) => NaN