['1', '2', '3'].map(parseInt)问这一段代码输出的结果是什么?
单看这一行代码,可能不是那么好理解,把parseInt函数作为一个参数传进来,我们换一种更直观的方式来替换当前代码。
map()函数接收两个参数,item当前每一项,index当前项的索引,所以我们可以把上面这行代码写成:
['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
})
这样是不是就直观很多了呢?
parseInt用来解析一个字符串并返回指定基数的十进制整数,函数接收的前两个参数,第一个参数是被解析的字符串,第二个参数为基数。
parseInt(string, radix)。
从 2
到 36
,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。
如果 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
(十进制)。
如果第一个字符不能转换为数字,parseInt
会返回 NaN
。
例如parseInt('0xF', 16), 表示被解析的值是一个16进制的数,被解析的值为'0xF',返回的是'0xF'的十进制数。console.log(parseInt('0xF', 16)) ----> 1500。
例如下面的例子,表示被解析的值是一个2进制的数,但'546'并不是一个二进制的数,所以parseInt('546', 2) ----> NaN。
parseInt("546", 2)
['1', '2', '3'].map((item, index) => {
return parseInt(item, index)
})
最终是这样执行的
输入的基数是0 ,按十进制或者八进制来转换,所以转换出来是1
parseInt('1', 0) ---->1
输入的基数是1 ,但是我们并没有1进制的数,所以转换出来是NaN
parseInt('2', 1) ----> NaN
输入的基数是2 ,按二进制来转换,3不是一个2进制的数,所以转换出来是NaN
parseInt('3', 2) ----> NaN
所以最终的结果是---->[1,NaN,NaN]
再来看一个练习题,['10', '10', '10','10','10'].map(parseInt)最终输出结果是多少呢?
上面这行代码经历了以下历程:
parseInt('10', 0) ---->10 输入的基数是0 ,按十进制或者八进制来转换,所以转换出来是10
parseInt('10', 1) ----> NaN 输入的基数是1 ,我们没有1进制的数,所以返回NaN
parseInt('10', 2) ----> 2 输入的基数是2 ,按二进制,10按二进制转换得到2
parseInt('10', 3) ----> 3 输入的基数是3 ,按三进制,10按三进制转换得到3
parseInt('10', 4) ----> 4 输入的基数是4 ,按四进制,10按四进制转换得到4
所以最终输出结果是[10, NaN, 2, 3, 4]
我们可以使用Number来代替parseInt,例如:
['10', '10', '10','10','10'].map(Number) ----> ['10', '10', '10','10','10']