["1", "2", "3"].map(parseInt)返回结果是什么?你可能觉的会是[1, 2, 3],但实际的结果为 [1, NaN, NaN]。
为什么是这个结果呢?我们先来看看parseInt和map函数吧。
parseInt
parseInt(string, radix)函数可解析一个字符串,并返回一个整数。
参数 | 描述 |
---|---|
string | 必需。要被解析的字符串。 |
radix | 可选。表示要解析的数字的基数。该值介于 2 ~ 36 之间。 |
当参数 radix 的值为 0,或没有设置该参数时,parseInt() 会根据 string 来判断数字的基数。
当忽略参数 radix , JavaScript 默认数字的基数如下:
- 如果 string 以 "0x" 开头,parseInt() 会把 string 的其余部分解析为十六进制的整数。
- 如果 string 以 0 开头,ECMAScript 5,默认的是十进制的基数。旧的浏览器由于使用旧版本的ECMAScript(ECMAScript版本小于ECMAScript 5)默认使用八进制基数。
- 如果 string 以 1 ~ 9 的数字开头,parseInt() 将把它解析为十进制的整数。
map
array.map(function(currentValue,index,arr), thisValue)是数组上的一个方法,该方法返回一个新数组,数组中的元素为原始数组元素调用函数处理后的值。该方法按照原始数组元素顺序依次处理元素。map() 不会对空数组进行检测;不会改变原始数组。
参数 | 描述 | ||||||||
---|---|---|---|---|---|---|---|---|---|
function(currentValue,index,arr) | 必须。函数,数组中的每个元素都会执行这个函数
|
||||||||
thisValue | 可选。对象作为该执行回调时使用,传递给函数,用作 "this" 的值。 如果省略了 thisValue,或者传入 null、undefined,那么回调函数的 this 为全局对象。 |
解析
下面让我们来解决开头提出的问题。
array.map(parseInt)对数组array的每一项调用parseInt()方法,传入的参数为currentValue、index、arr,即每一项的值、该值的索引、该数组。但parseInt只接收两项参数,第三项参数会被忽视。
所以,["1", "2", "3"].map(parseInt)相当于[parseInt("1",0),parseInt("2",1),parseInt("3",2)]
(当参数 radix 的值为 0时,parseInt() 根据 string 来判断数字的基数。)
所以结果为[1,NaN,NaN]
拓展
如果我们要利用map方法将字符数组(如["1", "2", "3"])转为数字数组,我们可以怎样做呢?
['1','2','3'].map(str=>parseInt(str)); //[ 1, 2, 3 ]
['1.1','2.2e2','3e300'].map(str=>parseFloat(str)); //[ 1.1, 220, 3e+300 ]
['1','2','3'].map(Number); //[ 1, 2, 3 ]
['1.1','2.2e2','3e300'].map(Number); //[ 1.1, 220, 3e+300 ]
转载:https://blog.csdn.net/weixin_40161974/article/details/102246001