为了账号安全,请及时绑定邮箱和手机立即绑定

为什么parseInt使用Array#map生成NaN?

为什么parseInt使用Array#map生成NaN?

繁花不似锦 2019-06-10 17:09:57
为什么parseInt使用Array#map生成NaN?从Mozilla开发人员网络:[1,4,9].map(Math.sqrt)将产生:[1,2,3]为什么这样做:['1','2','3'].map(parseInt)让我们这样做:[1, NaN, NaN]我在Firefox3.0.1和Chrome0.3中进行了测试,作为免责声明,我知道这不是跨浏览器功能(没有IE)。我发现以下内容将达到预期的效果。然而,它仍然不能解释parseInt.['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
查看完整描述

3 回答

?
月关宝盒

TA贡献1772条经验 获得超5个赞

中的回调函数Array.map参数:

从同样的Mozilla页面你所链接的:

回调由三个参数调用:元素的值、元素的索引和正在遍历的Array对象。“

所以如果你调用一个函数parseInt这实际上是期望参数,第二个参数将是元素的索引。

在这种情况下,你最后打电话给parseInt与基数0,1和2依次。第一种方法与不提供参数相同,因此它基于输入(在本例中为10基)默认。基数1是不可能的数字基数,3不是基数2中的有效数字:

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

因此,在本例中,您需要包装器函数:

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

或者使用ES 2015+语法:

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

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


查看完整回答
反对 回复 2019-06-10
?
互换的青春

TA贡献1797条经验 获得超6个赞

map正在传递第二个参数,这个参数(在许多情况下)会导致混乱。parseInt的基数参数。

如果使用下划线,则可以:

['10','1','100'].map(_.partial(parseInt, _, 10))

或无下划线:

['10','1','100'].map(function(x) { return parseInt(x, 10); });


查看完整回答
反对 回复 2019-06-10
?
MYYA

TA贡献1868条经验 获得超4个赞

我敢打赌,这是关于ParseInt的第二个参数,基数的奇怪的事情。为什么它要用Array.map而不是当你直接调用它的时候,我不知道。

//  Works fineparseInt( 4 );parseInt( 9 );//  Breaks!  Why?[1,4,9].map( parseInt );
//  Fixes the problem[1,4,9].map( function( num ){ return parseInt( num, 10 ) } );


查看完整回答
反对 回复 2019-06-10
  • 3 回答
  • 0 关注
  • 608 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信