最近几次老是看到这个问题 ['1','2','3'].map(parseInt)
,感觉都没有说到重点,也不知道是太简单了还是怎么的,都不屑于解释了,既然如此,我便自告奋勇来说道说道了。
一些必要的说明
parseInt
在 mdn 上可以到 parseInt
的第二个参数 radix
取值范围为 2~36 ,如果取值是 0
, 1
又会如何呢。
parseInt(1, 0)
parseInt(1, 1)
首先解释为 0
,根据mdn上的说明:
如果 radix
是 undefined
、0
或未指定的,JavaScript会假定以下情况:
- 如果输入的
string
以 "0x
"或 "0x
"(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被解析为十六进制数。 - 如果输入的
string
以 "0
"(0)开头,radix
被假定为8
(八进制)或10
(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用parseInt
时,一定要指定一个 radix。 - 如果输入的
string
以任何其他值开头,radix
是10
(十进制)。
根据上面可以知道,若 radix=0
时,相当于默认为 10进制
,那接下来好说了
parsetInt(1, 0)
// 相当于
parsetInt(1, 10) // => 1 * 10^0 = 1 * 1 = 1
因而 parseInt(1, 0) = 1
接下来解释 1
1
表示 1进制
但是目前 1进制
具体是用 0
还是用 1
,没有明确的说明,详见知乎 因而导致
parsetInt(1,1)
直接变成了 NaN
- 这里需要简单说明一下
- 二进制:0,1 数字进行
- 八进制:0~7
- 10进制: 0~9
- 16进制:0~9 A~F
现在可以来说明 ['1','2','3'].map(parseInt)
为何是 1,NaN,NaN
其实可以变成这样的写法
['1', '2', '3'].map(function (value, index) {
return parseInt(value, index)
})
// 细节
index = 0: parsetInt('1', 0) = 1
index = 1: parsetInt('2', 1) = NaN
index = 2: parsetInt('3', 2) = NaN // 因为 2进制必须是 0,1数字表示
假设上面的数组变更一下呢
['1', '2', '011'].map(parseInt) // 1,NaN,3
此致,便解释清楚了,考点在于 进制转换,以及 parseInt
的一些细节是否知道的问题。