每日一题:['1', '2', '3'].map(parseInt) what & why

1. 结果

[1,NaN,NaN]

2. 为什么

因为['1', '2', '3'].map(parseInt)相当于这段代码
['1', '2', '3'].map((i, index) => return parseInt(i, index))

数组的map方法无需多说,简写如题目所示,展开则是[].map((i, index) => return parseInt(i, index))

parseInt之所以除了i还有一个参数,是因为parseInt有两个参数,分别是

  1. 需要转换的值
  2. 需要解析的数字基数,当没有指定或为0的时候默认是10

要解析的数字的基数。该值介于 2 ~ 36 之间。如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。


parseInt(1, 0) // 1
parseInt(2, 1) // NaN
parseInt(3, 2) // NaN

怎么计算parseInt()呢?

参考 @twosugar的方法,这个比较好记忆

  1. 第二位(radix)默认为10(十进制)
parseInt(10) // 10
 parseInt(10,  10) // 10

  1. radix取2-36
parseInt(10, 1) // NaN
parseInt(10, 3) // 3
parseInt(10, 37) // NaN

  1. 如何计算最终输出?
parseInt(10, 3) // 3

10任何一位数都<3,且3(radix)在2~36之间,所以可以得出一个非NaN的值

当前为3进制,计算:

1 * 3^1 + 0 * 3^0 = 3

parseInt(102, 2) // 2

在102中 ,第三位2 >= 2 (第二位,即radix = 2) ,并且 radix在2到36之间 这个时候忽略大于等于radix位及其之后的所有数值 。则现在 102 ==> 10

当前为2进制,计算:

1 * 2^1 + 0 * 2^0 = 2

parseInt(1061, 3) // 3

在1061中 ,第2位 6 >= 2 (第二位,即radix = 2) ,并且 radix在2到36之间 这个时候忽略大于等于radix位及其之后的所有数值 。则现在 1061 ==> 10

当前为3进制,计算:

1 * 3^1 + 0 * 3^0 = 3

parseInt(3061, 3) // NaN

当第一位数大于radix时,返回NaN

你可能感兴趣的:(每日一题:['1', '2', '3'].map(parseInt) what & why)