繁体   English   中英

为什么映射“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 ]

为什么这些表达方式不一样? 以无点样式调用 function 与任意 function 是否存在语义差异?

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

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM