为什么[1,2,3].map(parseInt)会输出
[1, NaN, NaN]`?
map
先看map
。map
方法里接受一个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或者未指定,有三种情况
- 以“0x”或“0X”开头,radix为16
- 以“0”开头,redix为8或10,不同浏览器有差别
- 以其他任何值开头,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