核心提示:注:本文 JS 是基于 ES5 之后,之前的不做考虑。先看一个小例子:parseInt(1/0, 19);//结果为 18这是为什么?首先得了解一下 parseInt 这个方法,这里就不做详细解释了,...
注:本文 JS 是基于 ES5 之后,之前的不做考虑。
先看一个小例子:
parseInt(1/0, 19);//结果为 18
这是为什么?
首先得了解一下 parseInt 这个方法,这里就不做详细解释了,网上一找一大把。
基本作用就是将一个 字符串 转换成一个 数字。
工作原理是这样的,第一个参数是需要转换的值,第二个参数是转换的进制,比如:二进制,八进制,十进制,十六进制,十八进制等。
对于第一参数,需要有以下注意:
接收的是一个字符串类型的值; 可以传入任意类型的值,比如 function, object …..; 如果不是一个字符串,会先进行隐式转换成一个字符串;比如一个 Object:
parseInt(new String(44));//44 var a = { name: "45", toString: function() { return this.name; } }; parseInt(a);//45
比如一个 Function:
function a() { return "123"; } parseInt(a());
对于第二个参数,也需要注意以下几点:
表示转换的进制,或是称作基数,默认是2|8|10|16|18 等等,但貌似 parseInt 函数内部并没有做这样的严格 check,从一方面表明 JS 功能的良好扩展性;
对于这个进制或称为基数,需要注意,由于并没有做 check,所以用户可以输入任意的值;
如果输入的是一个非数字,为直接忽略掉,而使用默认的 10 进制;
如果输入的数字,貌似只有[ 2 - 36] 之间的数字才有效,并不支持 六十 或 六十四 进制;
如果输入的数字是1,则会返回 NaN。
系统">进位制的记数系统
基本进位制
二进制 三进制 四进制 五进制 六进制 七进制 八进制 九进制 十进制 十一进制 十二进制 十三进制 十四进制 十五进制 十六进制 十八进制 二十进制 二十四进制 二十六进制 二十七进制 三十进制 三十二进制 三十六进制 六十进制 六十四进制 平衡进位制
平衡三进制 平衡五进制 平衡九进制 特殊进位制
Base64 十进位制 二进指数法 黄金进制 斐波那契编码 e进制 相关条目
位 位元 进位制 米迪定理 记数系统
第二个参数的代码示例:
console.log(parseInt(18363, "sd"));//18363 for (var i = 1; i < 65; i++) { console.log(i, parseInt(123456789, i)); } //结果: 1 NaN 2 1 3 5 4 27 5 194 6 1865 7 22875 8 342391 9 6053444 10 123456789 11 259374245 12 511713753 13 957350637 14 1711566005 15 2942093829 16 4886718345 17 7874976173 18 12354557877 19 18923044005 20 28365650969 21 41699702445 22 60226582293 23 85591965317 24 119855162505 25 165568457709 26 225867353045 27 304572680613 28 406305578457 29 536616369005 30 702128418549 31 910698096645 32 1171591994633 33 1495682602797 34 1895663686005 35 2386286637989 36 2984619134745 37 NaN 38 NaN 39 NaN 40 NaN 41 NaN 42 NaN 43 NaN 44 NaN 45 NaN 46 NaN 47 NaN 48 NaN 49 NaN 50 NaN 51 NaN 52 NaN 53 NaN 54 NaN 55 NaN 56 NaN 57 NaN 58 NaN 59 NaN 60 NaN 61 NaN 62 NaN 63 NaN 64 NaN
关于 Base 数值对应表,以下以 21 | 20 | 19 | 10 为例:
Str | Base 21 | Base 20 | Base 19 | Base 10 (decimal) |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
1 | 1 | 1 | 1 | 1 |
2 | 2 | 2 | 2 | 2 |
3 | 3 | 3 | 3 | 3 |
4 | 4 | 4 | 4 | 4 |
5 | 5 | 5 | 5 | 5 |
6 | 6 | 6 | 6 | 6 |
7 | 7 | 7 | 7 | 7 |
8 | 8 | 8 | 8 | 8 |
9 | 9 | 9 | 9 | 9 |
a | 10 | 10 | 10 | NaN |
b | 11 | 11 | 11 | NaN |
c | 12 | 12 | 12 | NaN |
d | 13 | 13 | 13 | NaN |
e | 14 | 14 | 14 | NaN |
f | 15 | 15 | 15 | NaN |
g | 16 | 16 | 16 | NaN |
h | 17 | 17 | 17 | NaN |
i | 18 | 18 | 18 | NaN |
j | 19 | 19 | NaN | NaN |
k | 20 | NaN | NaN | NaN |
l | NaN | NaN | NaN | NaN |
m | NaN | NaN | NaN | NaN |
所以本文的第一个例子中,parseInt( 1 / 0, 19),首先会将第一个参数 1 / 0 转换成字符串 “Infinity”,再将其以 Base 19 转换成数值。
如上Base 数值对应表可见,Base 为 19 可以接受的字符串为 [0-9a-i] (字母不区分大小写),所以将 i 转换成 18,而其后的 “nfinity” 全部会省略掉,所以最终的结果为 18。