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有两个参数,分别是
- 需要转换的值
- 需要解析的数字基数,当没有指定或为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的方法,这个比较好记忆
- 第二位(radix)默认为10(十进制)
parseInt(10) // 10
parseInt(10, 10) // 10
- radix取2-36
parseInt(10, 1) // NaN
parseInt(10, 3) // 3
parseInt(10, 37) // NaN
- 如何计算最终输出?
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