假设我们想要把一个字符串数组的每一项转换成整数,我们很自然就想到了把parseInt作为回调函数传给map()函数,但这样做可能会出现意想不到的结果:

 

var strArr = ["1", "2", "3"];
var numArr = strArr.map(parseInt);
console.log(numArr); // [1, NaN, NaN]

 

在上面的代码中,我们尝试使用map()把数组strArr的每一项由字符串转换成数字,但发现只有第一项成功了,剩余两项却变成了NaN。

出现这种情况的原因是,parseInt()默认接受两个参数,第一个参数是要转换成整数的字符串,第二个参数表示传入的值是几进制格式的(注意不是转换成几进制的值),而map会默认地把三个参数element, index, array传给callback函数。在上面这种情况下,虽然第三个参数被忽略了,但前两个参数都传给了parseInt,所以以上代码可以看作是:

var numArr = strArr.map(function(ele,index) {
    return parseInt(ele, index);
});

//分别来看每一项的话

//parseInt("1", 0) => 1
//parseInt("2", 1) => NaN
//parseInt("3", 2) => NaN

解决办法

var numArr = strArr.map(function(ele) {
    return parseInt(ele, 10);
});

// 或者使用箭头函数

var numArr = strArr.map(ele => parseInt(ele, 10));

注意:因为多数情况下,我们要解析的值都是十进制的,所以强烈建议使用parseInt时始终把10作为第二个参数。