parseInt

今天看到公司内部平台推送了一道关于parseInt的问题,发现结果出乎一聊,根本原因是对于parseInt执行理解不清晰,这里Mark下。

问题

1
2
3
4
5
6
7
8
9
10
11
parseInt('0xf',16)
// 15

parseInt('0xf')
// 15

parseInt(0xf,16)
// 21

parseInt(15,16)
// 21

解释

  1. parseInt第一个参数,会从首个非空格字符开始,对于非字符串会做ToString转换,因此parseInt(15,16)本质就是parseInt(‘15’,16)。
  2. parseInt(‘0xf’,16),JS识别字符串是16进制数字,radix也是16进制,因此直接解析为15。parseInt(‘0xf’)虽然没有传radix,但是根据字符串0x前缀还是识别为16进制因此还是15。

面试题

了解了处理逻辑,这里分析下代码

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

上述程序的每次回调逻辑如下。

1
2
3
4
5
parseInt(1,0); // 1

parseInt(2,1); // NaN

parseInt(3,2); // NaN

radix为0等价于10进制。radix为1,因此为NaN。2进制下不会有3,因此为NaN。

个人觉得记住这些处理逻辑并没有多大价值。真正的价值点是

  1. 注意自动类型转换,JS下这种问题很多。
  2. map(parseInt)之类回调写法注意,避免将index误传入造成最终结果不符合预期。