有人可以解释为什么会有意想不到的结果:
["1", "2", "3"].map(parseInt);
哪个返回 [1, NaN, NaN] 而不是 [1, 2, 3]?</p>
我可以通过强制使用单参数函数来使其工作:
["1", "2", "3"].map(function(s) {return parseInt(s);});
但我不知道第一种方式到底出了什么问题。
有人可以解释为什么会有意想不到的结果:
["1", "2", "3"].map(parseInt);
哪个返回 [1, NaN, NaN] 而不是 [1, 2, 3]?</p>
我可以通过强制使用单参数函数来使其工作:
["1", "2", "3"].map(function(s) {return parseInt(s);});
但我不知道第一种方式到底出了什么问题。
正如其他人提到的,问题是由于第二个论点。
来自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));
本文在最后一个示例中描述了您的问题,与您尝试做的完全相同。但是,他们引用的博客文章不再存在。
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
parseInt
接受两个参数(第二个是基数),这就是为什么这不起作用。有关更多信息,请参阅此MDN 页面的底部。引用:
parseInt 通常与一个参数一起使用,但需要两个。第二个是基数 对于回调函数,Array.prototype.map 传递 3 个参数:元素、索引、数组。parseInt 忽略了第三个参数,但没有忽略第二个参数,因此可能会造成混淆。