2

有人可以解释为什么会有意想不到的结果:

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

哪个返回 [1, NaN, NaN] 而不是 [1, 2, 3]?</p>

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

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

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

4

3 回答 3

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));
于 2013-06-30T10:10:40.290 回答
1

本文在最后一个示例中描述了您的问题,与您尝试做的完全相同。但是,他们引用的博客文章不再存在。

array.map() 和 parseInt 回调

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 
于 2013-06-30T10:03:55.857 回答
1

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

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

于 2013-06-30T10:04:55.870 回答