JS | 神奇的parsetInt( 🤔, 🤨 )

501 阅读2分钟

故事的开始从一个色盘的HSV进制转换开始

当我在控制台输入 👇👇👇👇👇👇

parseInt(011, 2); // --> NaN;
parseInt(11, 2); // --> 3

麻了 我麻了

parseInt

以下为 W3C 上的定义

parseInt() 函数可解析一个字符串,并返回一个整数。

当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。

当忽略参数 radix , JavaScript 默认数字的基数如下:

  • 如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。

  • 如果 string 以 0 开头,那么 ECMAScript v3 允许 parseInt() 的一个实现把其后的字符解析为八进制或十六进制的数字。

  • 如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。

再来看 parseInt(011, 2)

011 会被 parseInt 理解为八进制 从而转换为 9

而二进制只有 0 和 1 所以结果为 NaN

思考题 🤔

['1', '2', '3'].map(parseInt);

答案在 👇👇👇👇👇

该语句在执行时候 等价于`['1','2','3'].map((value,index) => parseInt(value,index))`
parseInt('1',0) // 基数为0时 当10进制来处理 就是自身 --> 1
parseInt('2',1) // 基数为1时 只有一个状态0 而2不是一个一进制的数 --> NaN
parseInt('3',2) // 基数为2时 状态有0/1/2  而3不是一个二进制的数 --> NaN

more

parseInt(0.1) --> ?
parseInt(0.01) --> ?
parseInt(0.001) --> ?
parseInt(0.0001) --> ?
parseInt(0.00001) --> ?
parseInt(0.000001) --> ?
parseInt(0.0000001) --> ?

如果是这样呢

parseInt(1e1) --> ?
parseInt(1e2) --> ?
parseInt(1e3) --> ?
parseInt(1e4) --> ?
......

更多涉及 parseInt 可参考 国外小哥哥的博客

进制间的转换

转十进制

/**
 * parseInt
 * @param string  要转换成十进制的数
 * @param radix 要转换成十进制的数的进制 【 2 - 36 】 默认为 10
 */
parseInt(string, radix);

通用方法

/**
 * toString
 * @param radix 要转换的进制 【 2 - 36 】 默认为 10
 */
Number.prototype.toString(radix);

因为在转换的时候 js并不知道要解析的数是几进制的 所以可以先转换成十进制

再使用上述方法