['1', '2', '3'].map(parseInt)问题引申

67 阅读2分钟

['1', '2', '3'].map(parseInt)问题引申

常见面试题如:['1', '2', '3'].map(parseInt)打印值

  • 答:['1', '2', '3'].map(parseInt)可以解析为
['1', '2', '3'].map((item,index,arr) => {
    return parseInt(item, index, arr))
})

涉及知识点

  • 数组的map方法

Array.prototype.map() map() 方法创建一个新数组,这个新数组由原数组中的每个元素都调用一次提供的函数后的返回值组成。

  • parseInt

parseInt(string, radix) 解析一个字符串并返回指定基数的==十进制==整数,radix 是 2-36 之间的整数,表示被解析字符串的基数。 parseInt函数将其第一个参数转换为一个字符串,对该字符串进行解析,然后返回一个整数或 ==NaN==。 第一个参数是我们需要转换的字符串。第二个参数是字符串的基数 radix,比如是 2 的话,就代表字符串是用二进制表达的。需要特别注意的是,第二个参数是可选的。

第二个参数如果省略,情况会变得复杂。如果字符串以 0x 或 0X 开头,它就会当作十六进制,否则被当作十进制。

下面说一些例子:

parseInt('10', 2);
// => 2。(1 * 2 + 0 * 1)

parseInt('0xa');
// => 10。被当作十六进制,等价于 parseInt('a', 16)

parseInt('123');
// => 123。被当作十进制,最常见的用法,

注意以下几点

  1. 对于 radix 为 10 以上的,英文字母表示大于 9 的数字。例如,对于十六进制数(基数 16),则使用 A 到 F。
  2. 如果 parseInt 遇到的字符不是指定 radix 参数中的数字,它将忽略该字符以及所有后续字符,并返回到该点为止已解析的整数值。parseInt 将数字截断为整数值。允许前导和尾随空格。
  3. radix为从 2 到 36 的整数,超出或不在范围内结果都为NaN(假如指定 0 或未指定,基数将会根据字符串的值进行推算。)
一般例如:parseInt('123')
 = 1*10^2+2*10^1+3*10^0
 = 100+20+3
 = 123
 
二进制的例如:parseInt('1023', 2)
这里第三位和第四位数字大于等于radix,忽略不计, so
= 1*2^1+0*20
= 2

大于十进制的例如:parseInt('123', 11)
= 1*11^2+2*11^1+3*11^0
= 121+22+3
= 146

16进制的例如:parseInt('0xab') = parseInt('0xab', 16)
这里16进制中a-f(A-F)可以表示10-15,so
= 10*16^1+11*16^0
= 160+11
= 171