开门见山,我们先来看两个例子。
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)});