# 题目描述

['1', '2', '3'].map(parseInt)返回值是什么?

返回值为[ 1, NaN, NaN ]

# 分析

map 是传入的函数是有 3 个参数的: value, index, arr

parseInt(string, radix)

两个参数解释如下:

  • string,要被解析的值。如果参数不是一个字符串,则将其转换为字符串,底层是使用toString 抽象操作的。字符串开头的空白符将会被忽略。
  • radix 可选,从 2 到 36,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。请注意,10不是默认值!

所以我们执行['1', '2', '3'].map(parseInt)这行代码,其实是在执行下面这三行代码

parseInt('1', 0); 
parseInt('2', 1); 
parseInt('3', 2); 
1
2
3

我们先来看实际执行的第二行代码,parseInt('2', 1)radix 的值只能接收 2-36,而此时是1,所以返回NaN

第三行代码,parseInt('3', 2), radix 的值为2,表示前边的字符串数字我们将会以二进制来识别,而二进制只能是01,此时是3,所以返回NaN

最后来看第一行代码,radix的值为0,当radix为0时,我们就要看string的值了

如果 radixundefined、0或未指定的,JavaScript会假定以下情况:👇

TIP

  • 如果输入的 string"0x""0x"(一个0,后面是小写或大写的X)开头,那么radix被假定为16,字符串的其余部分被当做十六进制数去解析。
  • 如果输入的 string以 "0"(0)开头, radix被假定为8(八进制)或10(十进制)。具体选择哪一个radix取决于实现。ECMAScript 5 澄清了应该使用 10 (十进制),但不是所有的浏览器都支持。因此,在使用 parseInt 时,一定要指定一个 radix
  • 如果输入的 string 以任何其他值开头, radix 是 10 (十进制)。

所以此时是十进制识别string,所以返回1

所以这行代码['1', '2', '3'].map(parseInt)的返回值就是[1, NaN, NaN]