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

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


繁花不似锦
浏览 609回答 3
3回答

月关宝盒

中的回调函数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.)

互换的青春

map正在传递第二个参数,这个参数(在许多情况下)会导致混乱。parseInt的基数参数。如果使用下划线,则可以:['10','1','100'].map(_.partial(parseInt, _, 10))或无下划线:['10','1','100'].map(function(x) { return parseInt(x, 10); });

MYYA

我敢打赌,这是关于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 ) } );
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript