意外的“地图”结果(Javascript)

时间:2013-06-30 09:59:13

标签: javascript map

有人可以解释为什么会出现意外结果:

["1", "2", "3"].map(parseInt);

返回[1,NaN,NaN]而不是[1,2,3]?

我可以通过强制单参数函数来使其工作:

["1", "2", "3"].map(function(s) {return parseInt(s);});

但我不知道第一种方式究竟出了什么问题。

3 个答案:

答案 0 :(得分:2)

正如其他人提到的,问题是由于第二个论点。

来自 MDN 的评论:

// parseInt is often used with one argument, but takes two. The second being the radix
// To the callback function, Array.prototype.map passes 3 arguments: the element, the index, the array
// The third argument is ignored by parseInt, but not the second one, hence the possible confusion.
// See the blog post for more details

但是,使用bind,您可以获得所需的结果:

var _parseInt = function(radix, number) {
  return parseInt(number, radix);
}
["1", "2", "3"].map(_parseInt.bind(this, 10));

答案 1 :(得分:1)

本文在上一个示例中描述了您的问题,与您尝试的完全相同。然而,他们所引用的博客文章已不复存在。

array.map() and parseInt callback

Stackoverflow引用的更好答案:

  

因此,如果你调用一个实际上需要两个参数的函数,那么   第二个参数将是元素的索引。

     

在这种情况下,您最终调用了基数为0,1和2的parseInt   转。第一个与不提供参数相同,所以它   默认为基数10.基数1是不可能的数字基数,3是   不是基数2中的有效数字:

parseInt('1', 0); // OK - gives 1
parseInt('2', 1); // FAIL - 1 isn't a legal radix
parseInt('3', 2); // FAIL - 3 isn't legal in base 2 

答案 2 :(得分:1)

parseInt有两个参数(第二个是基数),这就是为什么这不起作用。有关详细信息,请参阅此MDN page的底部。引:

  

parseInt通常与一个参数一起使用,但需要两个参数。第二   作为基数对于回调函数,Array.prototype.map传递3   arguments:元素,索引,数组。第三个论点是   被parseInt忽略,但不是第二个,因此可能   混乱。