今天看到到这样一个问题:

    ["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。

好吧,到此为止,问题清楚了

 


posted on 2014-09-01 17:01  onedayof2010  阅读(302)  评论(0编辑  收藏  举报