【问题标题】:Javascript map strange behaviour [duplicate]Javascript映射奇怪的行为[重复]
【发布时间】:2013-10-31 15:27:17
【问题描述】:

我正在解决一些关于 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 上进行了尝试,得到了相同的结果。

【问题讨论】:

  • 我不确定你在问什么。 "102904".split("").map(function(x){ return parseInt(x);}); 似乎在 Chrome 30 中返回了预期的结果。
  • 是的,我会删除它,但 SO 告诉我不能...

标签: javascript map


【解决方案1】:

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

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

问题数字是:0, 2, 9

为什么?

  • 0 - 基数作为 1 传递。1 不是合法的基数,所以 NaN
  • 2 - 基数作为 2 传递。在 2 中,基数 2 不可用数字(0 和 1 是)
  • 9 - 基数为 3。仍然 9 不是有效数字(0、1 和 2 是)

【讨论】:

    【解决方案2】:

    作为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 视为未提供:

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

    【讨论】:

    • 是的,我忘了地图发送 3 个参数。
    【解决方案3】:
    "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()(表示要解析的数字的基数)。


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

    【讨论】:

    • 是的,我在厨房里,意识到 js 发送多个参数来映射与其他函数式语言不同..
    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多