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

最近几次老是看到这个问题 ['1','2','3'].map(parseInt) ,感觉都没有说到重点,也不知道是太简单了还是怎么的,都不屑于解释了,既然如此,我便自告奋勇来说道说道了。

一些必要的说明

  • map 使用很简单,不做过多说明
  • parseInt 需要说一下,我们都知道用来对数据进行取整,若是不合理,便返回 NaN 。而且这货还有一个可选属性 radix ,而这也是我们此次重点说明的对象。

parseInt

在 mdn 上可以到 parseInt 的第二个参数 radix 取值范围为 2~36 ,如果取值是 0, 1 又会如何呢。

parseInt(1, 0)
parseInt(1, 1)

首先解释为 0 ,根据mdn上的说明:

如果 radix 是 undefined0或未指定的,JavaScript会假定以下情况:

  1. 如果输入的 string以 "0x"或 "0x"(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被解析为十六进制数。
  2. 如果输入的 string以 "0"(0)开头, radix被假定为8(八进制)或10(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix
  3. 如果输入的 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 的一些细节是否知道的问题。

上一篇:JavaScript:为什么命名参数比位置参数更好


下一篇:js中十进制与二进制、八进制、十六进制的互相转换