为什么 `parseInt` 无点样式的映射不能按预期工作?

Why doesn't mapping over `parseInt` point-free style work as expected?

我是 运行 Node.JS 控制台中的以下人员:

> ["30", "31", "32"].map(x => parseInt(x))
[ 30, 31, 32 ]
> ["30", "31", "32"].map(parseInt)
[ 30, NaN, NaN ]

为什么这些表达式不相同?与任意函数相比,以无点样式调用函数是否存在语义差异?

["30", "31", "32"].map(function(){
  console.log(arguments);
});

该问题很可能与 map 向回调传递的不仅仅是元素有关。它传递元素、索引和整个数组。因此,如果您让地图将所有这些传递到 parseInt 方法中,索引很可能会导致知道如何将字符串转换为相关基数的方法出现问题。

您传递给 map 的函数实际上从 map 获取三个参数:元素、索引和整个列表。

在您的第一个示例中,您显式绑定了 x 并将其传递给 parseInt,它有两个参数,字符串和格式。如果将格式保留为空,则默认为基数 10。

在您的第二个示例中,您将 map 发送的参数直接发送到 parseInt,这告诉 parseInt 使用索引作为第二个参数。

> ["30", "31", "32"].map(console.log)
30 0 [ '30', '31', '32' ]
31 1 [ '30', '31', '32' ]
32 2 [ '30', '31', '32' ]

parseInt 接受两个参数:数字字符串和基数。 Array#map 提供元素和索引作为其回调的前两个参数,这使得一些数字无法解析(主要原因可能是有些数字对于指定的基数无效,例如有数字2 将字符串解析为二进制时),结果为 NaN。可以使用 Number 函数来避免这个陷阱,因为它会忽略除第一个参数之外的所有参数。

["30", "31", "32"].map(Number)