有人可以解释为什么会出现意外结果:
["1", "2", "3"].map(parseInt);
返回[1,NaN,NaN]而不是[1,2,3]?
我可以通过强制单参数函数来使其工作:
["1", "2", "3"].map(function(s) {return parseInt(s);});
但我不知道第一种方式究竟出了什么问题。
答案 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忽略,但不是第二个,因此可能 混乱。