搞懂[1,2,3].map(parseInt)

201 阅读1分钟

为什么[1,2,3].map(parseInt)会输出[1, NaN, NaN]`?

map

先看mapmap方法里接受一个callback,这个callback接受三个参数:currentValue当前元素,index当前元素的索引,调用map的数组

parseInt

再看parseInt()接受两个参数,一个字符串和基数radix


传入一个函数看看参数情况

function xx(){
  console.log(arguments)
}

[1,2,3].map(xx)

//结果
/*
Arguments(3) [1, 0, Array(3)]
Arguments(3) [2, 1, Array(3)]
Arguments(3) [3, 2, Array(3)]
*/

所以map(parseInt),相当于给parseInt传了三个参数

parseInt('1', 0, the_array) # 1
parseInt('2', 1, the_array) # NaN
parseInt('3', 2, the_array) # NaN

然而parseInt第二个参数要求是大于等于2小于36,并且如果是undefined、0或者未指定,有三种情况

  1. 以“0x”或“0X”开头,radix为16
  2. 以“0”开头,redix为8或10,不同浏览器有差别
  3. 以其他任何值开头,radix是10
parseInt('1', 0, the_array) //radix为0,10进制,返回1
parseInt('2', 1, the_array) //radix为1,不在范围内,返回NaN
parseInt('3', 2, the_array) //radix为2,2进制的3无法转换为10进制,返回NaN

最后再来验证一下

给一个更长的数组

[1,2,3,4,5,6,7,8,9,10].map(parseInt)
//[1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 9]

如果字符串包含对于指定进制无意义的字符,则从最高位开始,只返回可以转换的数值。如果最高位无法转换,则直接返回NaN。

比如8进制中9是无意义的就返回NaN,而9进制的10按一位一位看其实是“1”“0”,加权后返回9