今天遇到一个问题
正常使用使用map这个高阶函数和parseInt这个方法配合使用的时候
首先先了解一下map这个函数
map是对数组的每一个元素调用回调函数并返回一个包含结果的数组,有三个参数,其中一个可选参数
arry1:必需。一个数组对象。
回调函数:必需。一个接受最多三个参数的函数。对于数组中的每个元素,map方法都会调用 callbackfn函数一次。
thisArg:可选。可在 callbackf 函数中为其引用 this 关键字的对象。如果省略 thisArg,则 undefined将用作 this值。
每次调用的时候,一般情况下,里面有一个回掉函数
var arrB=[1,2,3,4,5];
var arrC=arrB.map(function(num){
return num*3;
});
console.log(arrC);
结果为:
一般情况下我们都是这样运用map函数
但是向:
var arr1=['10','12','34','45'];
var arr2=arr1.map(Number);
console.log(arr2);
这种得到的结果为:
就是将字符串转化为数字嘛;但是我们用 :
var arr1=['10','12','34','45'];
var arr2=arr1.map(parseInt);
console.log(arr2);
得到的结果为啥成这样了呢:
parseInt不是也是将字符串转化为整数类型嘛,但其实并不是
我们看一下parseInt这个方法
他其实有两个参数的,一个string和radix,string就是传入的字符串,radix是进制,默认的就是10进制,传入一个字符将其转化为10进制
parseInt(12.23); //12
parseInt('12d'); //12
parseInt('d12'); //NaN
这是他的基本使用,会从第一个字符开始找,找到无法识别的字符,则返回前面的,如果第一个字符都无法识别的话,将返回NaN
,但是他其实有第二个参数,默认10(代表10进制),0,undefined
parseInt(string,radix);
radix的值可选为2~36;
如果我们写
parseInt('0x1231')
他就会默认以16进制进行转换
其实
['10','12','34','45'].map(parseInt);
把parseInt当做一个回调函数,他里面会传入两个值,一个数组的各个值还有一个数组的索引值
实际流程如下:
['10','12','34','45'].map(parseInt)等于[parseInt(10,0),parseInt(12,1),parseInt(33,2),parseInt(45,3);
parseInt(10,0) 0是默认,则为10
parseInt(12,1) 1不在 radix的值可选为2~36,所以返回NaN
parseInt(33,2) 把33当做2进制进行转换,但是二进制只有0和1,所以无法识别返回NaN
parseInt(45,3) 依然返回的是NaN
故最终的结果为: