parseInt

parseInt(string, radix)有2个参数,第一个string是传入的数值,第二个radix是传入数值的进制,参数radix可以忽略,默认为10,各种进制的数转换为 十进制整数(如果不是整数,向下取整)。

radix的取值范围是2~36,如果radix为1或radix>36 ,转换结果将是NaN,如果radix为0或其它值将被忽略,radix默认为 10 。

1
2
3
4
5
6
7
8
9
10
11
parseInt(0, 1);
// NaN

parseInt('z', 36);
// 35

parseInt('Z', 36);
// 35

parseInt('z', 37);
// NaN

实现 function atoi(str, base) {}
atoi(‘123’, 10); // 123
atoi(‘123’, 4); // 27

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
function atoi(str, base) {
// base 需要在 2 和 36 之间
if (base < 2 || base > 36) {
return NaN;
}
let result = 0;
let len = str.length;

function cton(char) {
if (/[a-zA-Z]/.test(char)) {
// 字母转成数字
char = char.toUpperCase().charCodeAt() - 65 + 10;
} else if (/\D/.test(char)) {
// 非法字符 直接返回 NaN
return NaN;
}

return char;
}

// 第一遍循环找出有效位数,字符需要在[0-9a-zA-Z] 之间
for (let i = 0; i < len; i++) {
let char = cton(str.charAt(i));
// 字符的值超过base或者非法,则截断,下次遍历只需要到前一位就可以了
if (isNaN(char) || char >= base) {
len = i;
break;
}
}
// 如果有效长度为 0 直接返回 NaN
if (len === 0) {
return NaN;
}
// 第二次遍历 累加值
for (let i = 0; i < len; i++) {
let char = cton(str.charAt(i));
result += char * Math.pow(base, len - i - 1);
}
return result;
}
0%