代码之家  ›  专栏  ›  技术社区  ›  Loïc Faure-Lacroix

Javascript映射奇怪行为[重复]

  •  4
  • Loïc Faure-Lacroix  · 技术社区  · 12 年前

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

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

    预期结果如下:

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

    但它却返回了:

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

    At认为映射应该应用于列表中的每个元素,这些元素是由1位数字组成的字符串。人们可能会认为它没有正确解析,因为没有使用基,但:

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

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

    我试过Chrome和Firefox,结果都是一样的。

    3 回复  |  直到 12 年前
        1
  •  7
  •   lukas.pukenis holographic-principle    12 年前

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

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

    问题数字为: 0, 2, 9

    为什么?

    • 0-将基数传递为1。1不是法定基数,所以 NaN
    • 2-将基数传递为2。在2中,基数2不可用数字(0和1 是)
    • 9-将基数传递为3。仍然9不是有效数字(0、1和2 是)
        2
  •  1
  •   lonesomeday    12 年前

    作为回调提供的函数 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 。这是因为 解析Int 处理基数 0 就好像没有提供一样:

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

        3
  •  1
  •   Saturnix    12 年前
    "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() (表示要解析的数字的基数)。


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