当前位置: 首页 > 面试题库 >

为什么parseInt用Array#map产生NaN?

阎功
2023-03-14
问题内容

来自Mozilla开发人员网络:

[1,4,9].map(Math.sqrt)

将产生:

[1,2,3]

为什么这样做:

['1','2','3'].map(parseInt)

产生这个:

[1, NaN, NaN]

我已经在Firefox 3.0.1和Chrome 0.3中进行了测试,并且免责声明,我知道这不是跨浏览器功能(没有IE)。

我发现以下将达到预期的效果。但是,它仍然不能解释的错误行为parseInt

['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]

问题答案:

中的回调函数Array.map具有 三个 参数:

在您链接到的同一Mozilla页面上:

回调使用三个参数来调用:元素的值,元素的索引和要遍历的Array对象。”

因此,如果调用parseInt实际上需要 两个 参数的函数,则第二个参数将是元素的索引。

在这种情况下,您最终parseInt依次调用基数0、1和2。第一个与不提供参数相同,因此默认基于输入(在本例中为10)。以1为底的数字是不可能的,以3为底的数字不是有效数字:

parseInt('1', 0); // OK - gives 1
parseInt('2', 1); // FAIL - 1 isn't a legal radix
parseInt('3', 2); // FAIL - 3 isn't legal in base 2

因此,在这种情况下,您需要包装函数:

['1','2','3'].map(function(num) { return parseInt(num, 10); });

或使用ES2015 +语法:

['1','2','3'].map(num => parseInt(num, 10));

(在两种情况下,最好如图所示显式提供一个基数parseInt,因为否则它会根据输入来猜测基数。在某些较旧的浏览器中,前导0会导致它猜测八进制,这往往是有问题的。它仍然会如果字符串以0x。开头,则猜测为十六进制。)



 类似资料:
  • 我阅读下面的文章,以了解我建立的ELK环境的日志技术。https://tpodolak.com/blog/tag/kibana/ 我在日志中添加了输入路径 C/日志/*.log。我有测试.log文件,它不为空,它有: 我的日志(C:\监控\logstash\日志\C:\监控\logstash\logs.log):

  • 下面的代码将输出“true”,这意味着Array()为true。在Python中,list()为False,这是否只是因为语言设计者的偏好?

  • 启动应用程序的代码如下: 在A点,我只是关闭了上下文来检查哪些beans已经关闭,然后Hibernate60秒,以便有时间检查JMX控制台。我注意到,即使上下文是关闭的,但是生产者仍然在JMX中注册。之后,我跟踪了代码,注意到在上下文关闭时,KafkaTemplate调用以下代码: 这意味着它创建了一个生产者,但是因为它是事务性的,所以它不会被关闭。 这使得在关闭上下文时,的方法将清除缓存并物理地

  • 问题内容: 将字符串转换为数字时,行为如何不同? 问题答案: 嗯,它们在语义上是不同的,称为函数的构造函数执行类型转换并执行 解析 ,例如: 请记住,如果在字符串上检测到前导零,它将以八进制为基础来解析数字,这在标准的新版本ECMAScript 5中已更改,但是要花很长时间才能进入浏览器实现((与ECMAScript3不兼容),也将忽略与当前使用的基数的任何数字都不对应的结尾字符。 该构造函数不检

  • 问题内容: 这行之间有什么区别: 这条线 此jsperf测试表明,假设适用于node.js !,在当前的chrome版本中,一元运算符要快得多。 如果我尝试转换不是数字的字符串,则都返回: 所以我什么时候应该更喜欢使用一元加号(尤其是在node.js中)??? 编辑 :和双波浪号运算符有什么区别? 问题答案: 好吧,这是我知道的一些区别: 空字符串的计算结果为a ,而其计算结果为。IMO,空白字符

  • 我观察到库函数,当它在循环中被调用一次时,它几乎总是产生正数。