parseInt(1 / 0, 19)

来源:互联网 发布:360软件助手 编辑:程序博客网 时间:2024/05/18 01:00

注:本文 JS 是基于 ES5 之后,之前的不做考虑。

先看一个小例子:
parseInt(1/0, 19);//结果为 18

这是为什么?

首先得了解一下 parseInt 这个方法,这里就不做详细解释了,网上一找一大把。
基本作用就是将一个 字符串 转换成一个 数字

工作原理是这样的,第一个参数是需要转换的值,第二个参数是转换的进制,比如:二进制,八进制,十进制,十六进制,十八进制等。

对于第一参数,需要有以下注意:
  • 接收的是一个字符串类型的值;
  • 可以传入任意类型的值,比如 function, object …..;
  • 如果不是一个字符串,会先进行隐式转换成一个字符串;

比如一个 Object:

parseInt(new String(44));//44var 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"));//18363for (var i = 1; i < 65; i++) {    console.log(i, parseInt(123456789, i));}//结果:1 NaN2 13 54 275 1946 18657 228758 3423919 605344410 12345678911 25937424512 51171375313 95735063714 171156600515 294209382916 488671834517 787497617318 1235455787719 1892304400520 2836565096921 4169970244522 6022658229323 8559196531724 11985516250525 16556845770926 22586735304527 30457268061328 40630557845729 53661636900530 70212841854931 91069809664532 117159199463333 149568260279734 189566368600535 238628663798936 298461913474537 NaN38 NaN39 NaN40 NaN41 NaN42 NaN43 NaN44 NaN45 NaN46 NaN47 NaN48 NaN49 NaN50 NaN51 NaN52 NaN53 NaN54 NaN55 NaN56 NaN57 NaN58 NaN59 NaN60 NaN61 NaN62 NaN63 NaN64 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