今天看到到这样一个问题:
["1", "2", "3"].map(parseInt) 执行结果是什么?
结果是[1,NAN,NAN],很出乎我的意料。。。。
人家给出的解释是这样的:
[1, NaN, NaN] 因为 parseInt 需要两个参数 (val, radix) 但 map 传了 3 个 (element, index, array)
然后再犀牛书上查了下map的API:
map()按照从小到大的顺序遍历array的序号,并为每一个元素调用一次f,对于序号i,调用时候带三个参数,f的返回值则存储在新数组的i处:
a[i] = f(array[i],i,array)
一旦map()将array中的每一个元素都传递给f,并将返回的结果保存到新数组中,则返回该新数组
我做了一下尝试:
["1", "2", "3"].map(parseInt(x,10)) //报错,我坑爹了,map()接受的是一个方法,不是执行结果
["1", "2", "3"].map(function(x){return parseInt(x,10)}) //这个结果是[1,2,3],是对的
["1", "2", "3"].map(function(x){return parseInt(x)}) //这个也是对的,因为parseInt默认的是10进制的,不过还是自己写靠谱,有时候0x开头的数字抽风
然后我查了下forEach,跟map介绍差不多,然后看到提到调用f(array[i],i,array),突然似乎明白了,原来每次调用的时候指定了传入的三个参数结果相当于这样:
parseInt("1",0)//1
parseInt("2",1)//NAN
parseInt("3",2)//NAN
我们可以这样试试:
["1", "0", "0"].map(parseInt) //返回[1, NaN, 0]
["1", "0", "2"].map(parseInt) //返回[1, NaN, NaN]
说明了问题是parseInt接受参数的问题了,查了下
parseInt第二个参数描述如下:
如果省略该参数或其值为 0,则数字将以 10 为基础来解析。如果它以 “0x” 或 “0X” 开头,将以 16 为基数。
如果该参数小于 2 或者大于 36,则 parseInt() 将返回 NaN。
好吧,到此为止,问题清楚了