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

首先,先搞明白parseInt函数和map函数的做用!!!数组

一、parseInt

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

语法函数

parseInt(string,radix)

第一个参数:string,要解析的字符串,这没什么好说的,必选参数。ui

第二个参数:radix,可选参数,表示你要按几进制的格式来解析字符串。this

radix传参
1. 传参
   要求:整数,且在2~36之间。
        若radix 大于36 或者 小于2且不等于0 ,那么直接返回NaN,
        若radix为0 ,则按照10进制来解析。
        若radix为字符串,则把这个先parseInt,再解析。
2. 不传参
   若要解析的字符串以'0x''0X'开头,那么以16进制解析。
   其他状况按10进制解析。复制代码

实际用法spa

// 1. 正常全解析
parseInt("123");        // 123
parseInt("489",10);     // 489
parseInt("1010",2);     // 10
parseInt("a01",16);     // 2561 1+0+10*16*16
parseInt("0xa01");      // 2561
parseInt("123",0);      // 123
parseInt("123","5");    // 38
parseInt("123","5.2");  // 38

// 2. radix不在范围内返回NaN
parseInt("123",1);      // NaN
parseInt("123",37);     // NaN

// 3. 因进制问题返回字符串部分解析结果
parseInt("102",2);      // 2
parseInt("10ac",10);    // 10

// 4. 因进制问题返回NaN
parseInt("a10",10);     // NaN复制代码

注意code

每种进制在 位上 都有它合理的取值范围,如:十进制,每一位的取值为0-9,十六进制为0-f,超出取值范围则不承认。索引

parseInt在解析字符串时,按照字符顺序一个一个检查,若是第一个字符就为超范围的值,则直接返回NaN,若不是则检查下一位,直到检查完毕或者碰到某一位值超范围,而后将检查过的不超范围的字符串解析,后面的舍弃。如:parseInt("456a23",10); 字符检查到a时,发现超出范围,则将从a之后的舍弃,只返回“456”的解析结果。字符串

2. map

map()方法返回一个新数组,数组中的元素为原始数组元素调用函数处理的后值。
string

map()方法按照原始数组元素顺序依次处理元素,它不处理空数组,也不会改变原始数组。

语法

arr.map(function(item,index,arr),thisValue)

第一个参数为数组值循环的处理函数,每一个值都通过此函数处理,item是当前值,index是当前值得索引值,arr是当前数组,其中item为必选参数,index与arr为可选参数

实际使用

var arr = [1,-2,3]
var newArr = arr.map((item,index)=>{
    return item>0?item:-item;  // 将数组元素变成正数后返回
})
newArr; // [1,2,3] 
复制代码

3. 当map赶上了parseInt

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

注意: 传参

parseInt做为map的处理函数,map是能够向其传递三个参数的,分别为item,index,arr

而parseInt是能够接收到两个参数的,因而乎,parseInt在接受参数时,接受了map传递过来的item和index

因此,var arr=['1','2','3']在map中每次解析其实在运行 parseInt(arr[index],index)

parseInt('1',0) // 按十进制解析 返回1
parseInt('2',1) // radix<2  返回NaN
parseInt('3',2) // 被解析字符串首个字符就不在二进制合理取值范围内,返回NaN复制代码
相关文章
相关标签/搜索