2013-06-30 57 views
2

有人可以解释为什么这有意想不到的结果:意外的 “地图” 的结果(JavaScript)的

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

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

我可以把它迫使一个单参数函数工作:

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

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

回答

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 
1

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

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

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));