4

我正在解决一些关于 codewars 的问题,并尝试将字符串转换为这样的数字列表:

"102904".split("").map(parseInt);

预期的结果将是这样的:

[1, 0, 2, 9, 0, 4]

但它反而返回:

[1, NaN, NaN, NaN, 0, 4]

相信 map 应该适用于列表中的每个元素,这些元素是 1 位数字的字符串。人们可能会认为它没有正确解析,因为未使用基数,但是:

"102904".split("").map(function(x){ return parseInt(x);});
[ 1, 0, 2, 9, 0, 4]

使用parseInt(x, 10), 不会改变结果。但是直接发送 parseInt 到 map 会创建NaN......

我在 Chrome 和 Firefox 上尝试过,我收到了相同的结果。

4

3 回答 3

7

parseInt涉及第二个参数 - 基数。

你的问题是 -map发送到参数:项目本身和索引。

问题数字是:0, 2, 9

为什么 ?

  • 0 - 基数作为 1 传递。1 不是合法的基数,所以NaN
  • 2 - 基数作为 2 传递。在 2 中,基数 2 不可用数字(0 和 1 是)
  • 9 - 基数作为 3 传递。仍然 9 不是有效数字(0、1 和 2 是)
于 2013-10-31T15:30:44.427 回答
1
"102904".split("").map(function(x, y){ console.log(x, y) });

返回

1 0
0 1
2 2
9 3
0 4
4 5

这意味着,在您的第一个示例中,parseInt会这样调用:

parseInt("1", 0);
parseInt("0", 1);
parseInt("2", 2);
parseInt("9", 3);
// ecc...

您将迭代的索引作为第二个参数传递给parseInt()(它表示要解析的数字的基数)。


最好的解决方案是使用第二种方法,使用您已经发布的代码。

于 2013-10-31T15:32:29.397 回答
1

作为回调提供的函数Array.prototype.map接收三个参数:

  • 数组中的元素
  • 数组中的索引
  • 数组本身

如果您为 提供两个参数parseInt,则第二个参数被视为基数 - 解析数字的数字基数。因此您的字符串将像这样解析

string | base | result
----------------------
1      | 0    | 1
0      | 1    | NaN
2      | 2    | NaN
9      | 3    | NaN
0      | 4    | 0
4      | 5    | 4

这里令人惊讶的行为是使用 base 0(这是不可能的),结果是1而不是NaN. 这是因为parseInt将基数0视为没有提供:

如果 radix 未定义或为 0(或不存在),JavaScript 假设如下:(MDN 文档)

于 2013-10-31T15:34:42.670 回答