["1", "2", "3"].map(parseInt)

为什么["1", "2", "3"].map(parseInt) 为 1,NaN,NaN;

parseInt() 

parseInt() 函数可解析一个字符串,并返回一个整数。

parseInt(string, radix)
参数描述
string 必需。要被解析的字符串。
radix

可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。

如果省略该参数或其值为 ‘0‘,则数字将以 10 为基础来解析。如果它以 ‘”0x”‘ 或 ‘”0X”‘ 开头,将以 16 为基数。

如果该参数小于 2 或者大于 36,则 ‘parseInt()‘ 将返回 ‘NaN‘

map 方法

对数组的每个元素调用定义的回调函数并返回包含结果的数组。

array.map(callbackfn, thisArg])
参数定义
array 必需。一个数组对象。
callbackfn 必需。一个接受**最多**三个参数的函数。对于数组中的每个元素,‘map‘ 方法都会调用 ‘callbackfn‘ 函数一次。
thisArg 可选。可在 ‘callbackfn‘ 函数中为其引用 ‘this‘ 关键字的对象。如果省略 ‘thisArg‘,则 ‘undefined‘ 将用作 ‘this‘ 值。

回调函数语法

回调函数的语法如下所示:

function callbackfn(value, index, array)
回调参数定义
value 数组元素的值。
index 数组元素的数字索引。
array1 包含该元素的数组对象。

现在回到最初的问题,

["1", "2", "3"].map(parseInt) 实际上是这么调用的:

parseInt('1',0,["1", "2", "3"]);

parseInt('2',1,["1", "2", "3"]);

parseInt('3',2,["1", "2", "3"]);

JS函数一般会自动忽视多余的参数,parseInt仅仅需要两个参数,所以我们并不需要担心第三个参数array参数对parseInt的影响。

那么第二个参数是如何影响parseInt的?

在第一次调用时,parseInt的第二个参数是0,上面已经说了,省略该参数或其值为 ‘0‘,则数字将以 10 为基础来解析,所以parseInt('1',0)为1;
parseInt('2',1) 如果该参数小于 2 或者大于 36,则 ‘parseInt()‘ 将返回 ‘NaN‘。,则 parseInt('2',1)为NaN;

parseInt('3',2)第一个string参数以2进制进行解析,而2进制只有0 1 组成,没有3,所以 parseInt('3',2)为NaN;

此问题解决方法

方法一:

['1','2','3'].map(function(value){
        return parseInt(value)
})

方法二:

['1','2','3'].map(Number)

延伸:

var a=["1", "2", "3", "4","5",6,7,8,9,10,11,12,13,14,15];
a.map(parseInt);
// [1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 9, 11, 13, 15, 17, 19]

因为

parseInt(10,9)//9
parseInt(11,10)//11
parseInt(12,11)//13 
...
原文地址:https://www.cnblogs.com/sunmarvell/p/9470998.html