我正在解决代码大战中的一些问题,并试图将字符串转换为这样的数字列表:
"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,但收到相同的结果。
答案 0 :(得分:7)
parseInt
涉及第二个参数 - 基数。
你的问题是 - map
发送到参数:项本身和索引。
问题数字为:0, 2, 9
为什么?
NaN
答案 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
。这是因为parseInt
将0
的基数视为未提供基数:
如果基数未定义或0(或不存在),则JavaScript假定以下内容:(MDN docs)