Javascript映射奇怪的行为

时间:2013-10-31 15:27:18

标签: javascript map

我正在解决代码大战中的一些问题,并试图将字符串转换为这样的数字列表:

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

预期结果将是这样的:

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

但它会返回:

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

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

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

使用parseInt(x, 10)不会更改结果。但直接将parseInt发送到地图会创建NaN ...

我尝试使用Chrome和Firefox,但收到相同的结果。

3 个答案:

答案 0 :(得分:7)

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

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

问题数字为:0, 2, 9

为什么?

  • 0 - 基数传递为1. 1不是合法基数,因此NaN
  • 2 - 基数传递为2.在2基数2中不可用数字(0和1 是)
  • 9 - 基数传递为3.仍然9不是有效数字(0,1和2 是)

答案 1 :(得分: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()(表示要解析的数字的基数)。


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

答案 2 :(得分: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

这里令人惊讶的行为是使用基础0(这是不可能的),结果是1而不是NaN。这是因为parseInt0的基数视为未提供基数:

  

如果基数未定义或0(或不存在),则JavaScript假定以下内容:(MDN docs)