关于Array的map方法中回调函数参数的问题

开门见山,我们先来看两个例子。

var arr=[‘1’,’4’,’9’,’16’];

var r=arr.map(Math.sqrt);

猜猜r的结果会是多少?

没错就是

[1,2,3,4]

我们再来试试另一个,

var arr=[‘1’,’4’,’9’,’16’];

var r=arr.map(parseInt);

再猜猜结果是多少?

是[1,4,9,16]?

console试一试看看结果是多少

[1,NaN,NaN,1]!

是不是大吃一惊

其实真相————

就是参数个数搞的鬼!

让我们再来看一个例子

var arr=[‘1’,’4’,’9’,’16’];

var r=arr.map(function(x){return parseInt(x)});

r//[1,4,9,16]

结果是不是就正常了!

其实在调用

arr.map(parseInt);的时候

传给map的参数有三个

当前的值(currentValuve)//依次是’1’,’4’,’9’,’16’

当前值的索引(currentIndex)//依次是0,1,2,3

以及当前数组(currentArray)//[‘1’,’4’,’9’,’16’],每次都是这个

而每次使用parseInt()函数的时候,却只传入了两个值(currentValue,currentIndex)

所以结果就是:

parseInt(‘1’,0)//1


而第二个参数假如经过 Number 函数转换后为 0 或 NaN,则将会忽略。——Mozilla官方文档

parseInt(‘4’,1)//非法,NaN

parseInt(‘9’,2)//非法,NaN

parseInt(‘16’,3)//这里值得注意,在解析字符串’16’的时候,发现6大于或等于3,所以其后的数字都被忽略,只剩下一个1返回了

如果 parseInt 遇到了不属于radix参数所指定的基数中的字符那么该字符和其后的字符都将被忽略。——Mozilla官方文档

最后知道真相的我们以后可千万得注意map函数中回调参数个数的问题啊!

var r=arr.map(function(x){return parseInt(x)});
文章也发表在博客园