# 题目描述
['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
2
3
我们先来看实际执行的第二行代码,parseInt('2', 1)
,radix
的值只能接收 2-36
,而此时是1
,所以返回NaN
第三行代码,parseInt('3', 2)
, radix
的值为2
,表示前边的字符串数字我们将会以二进制来识别,而二进制只能是0
和1
,此时是3
,所以返回NaN
最后来看第一行代码,radix
的值为0,当radix
为0时,我们就要看string
的值了
如果 radix
是 undefined、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]