parseInt深入探索

今天突然看到了一个js的题目[1,2,3].map(parseInt)应该输出什么,由于对parseInt的参数只是知道个大概,没有想出这个题目的结果,然后到MDN上面看了一下parseInt的解释:

parseInt(string, radix);

  1. string 要被解析的值。如果参数不是一个字符串,则将其转换为字符串(使用 ToString 抽象操作)。字符串开头的空白符将会被忽略。
  2. radix 一个介于2和36之间的整数(数学系统的基础),表示上述字符串的基数。比如参数”10”表示使用我们通常使用的十进制数值系统。始终指定此参数可以消除阅读该代码时的困惑并且保证转换结果可预测。当未指定基数时,不同的实现会产生不同的结果,通常将值默认为10。
  3. 返回解析后的整数值。 如果被解析参数的第一个字符无法被转化成数值类型,则返回 NaN。

由于[1,2,3].map(function(val,index){})中的val,index分别为(1,0)(2,1)(3,2)
所以[1,2,3].map(parseInt)相当于把(val,index)传入parseInt,即[parseInt(1,0),parseInt(2,1),parseInt(3,2)]


当基数radix为 undefined,或者基数为 0 或者没有指定的情况下,JavaScript 作如下处理:

  1. 如果字符串 string 以”0x”或者”0X”开头, 则基数是16 (16进制).
  2. 如果字符串 string 以”0”开头, 基数是8(八进制)或者10(十进制),那么具体是哪个基数由实现环境决定。ECMAScript 5 规定使用10,但是并不是所有的浏览器都遵循这个规定。因此,永远都要明确给出radix参数的值。
  3. 如果字符串 string 以其它任何值开头,则基数是10 (十进制)。

所以parseInt(1,0)parseInt(1,10),结果为1。


如果parseInt的字符不是指定基数中的数字,则忽略该字符和所有后续字符,并返回解析到该点的整数值。parseInt将数字截断为整数值。允许使用前导空格和尾随空格。
所以在parseInt(2,1)中,2不是1进制中的数字,因为1进制只有0,parseInt(3,2)中,3不是2进制中的数字,因为2进制只有0和1,所以会忽略该字符,即返回 NaN。

即该题目的结果为[1,NaN,NaN]。

总结:
可以这样理解,把radix进制的string转成10进制的数字,若string中的字符不在radix进制内,则忽略该字符和所有后续字符
parseInt(12,6),即把6进制的12转换成10进制,所以是8
parseInt(127,6),由于字符7不在6进制中,所以忽略,即也是把6进制的12转换成10进制,所以也是8