最近几次老是看到这个问题 [‘1‘,‘2‘,‘3‘].map(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
现在可以来说明 [‘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 的一些细节是否知道的问题。
原文:https://www.cnblogs.com/sinosaurus/p/13215052.html