Javascript Map、parseInt的奇怪行为
可能重复:Javascript Map、parseInt的奇怪行为,javascript,functional-programming,Javascript,Functional Programming,可能重复: 我看到了这个奇怪的JavaScript行为示例 评估为 [10, NaN, 2, 3, 4] 有人能解释一下这种行为吗?我用chrome和firebug进行了验证 ['10','10','10','10','10'].map(function(x){return parseInt(x);}) 以整数形式正确返回10的数组。这是对map()的不当使用、parseInt的错误还是其他原因?parseInt使用map传入的前两个参数,并使用第二个参数指定基数 下面是代码中发生的情况:
我看到了这个奇怪的JavaScript行为示例 评估为
[10, NaN, 2, 3, 4]
有人能解释一下这种行为吗?我用chrome和firebug进行了验证
['10','10','10','10','10'].map(function(x){return parseInt(x);})
以整数形式正确返回10的数组。这是对map()的不当使用、parseInt的错误还是其他原因?
parseInt
使用map传入的前两个参数,并使用第二个参数指定基数
下面是代码中发生的情况:
parseInt('10', 0) // 10
parseInt('10', 1) // NaN
parseInt('10', 2) // 2
parseInt('10', 3) // 3
parseInt('10', 4) // 4
这里有一个指向MDN的链接,位于parseInt
:。接收两个参数:字符串和基数:
var intValue=parseInt(字符串[,基数])代码>
处理程序的第二个参数是index:
。。。回调由三个参数调用:元素的值,
元素的索引和正在遍历的数组对象
来自MDN:
回调由三个参数调用:元素的值,
元素的索引和正在遍历的数组对象
parseInt()
接受两个参数。值和基数。这意味着正在使用非预期参数调用parseInt()
函数。ah这是有道理的,所以第二个数字尝试在基数1中求值,但失败了,其余的将只返回索引?这是有道理的。谢谢。其余的不是严格意义上的“返回索引”,但结果是一样的,因为基x
中的任何数字x
都表示为字符串'10'
。请注意,如果您的'10'
s数组中有36个以上的元素,那么您将在最后得到更多的NaN
s。是否有解决方法来实现这一点?thx@VincentWasteels是的,有点。您可以使用[…].map(parseFloat)
或[…].map(Number)
。两者都将字符串转换为给定数组中的数字。但是parseFloat
和Number
的工作原理与parseInt
稍有不同:两者都将转换浮点和整数,而Number
将转换以数字开头的字符串,并将其他字符包含在NaN
中(例如10abc
)Number
还可以将所有空格和不可打印字符强制转换为0
。作为一个字符串到数字的转换器,两者都能很好地工作,如果你真的需要使用parseInt
:那么使用匿名函数作为map
参数。回答正确,但不提供解决方案或替代方案。是的,这在我发布它时显示在related中,但在我编写它时不会显示在搜索结果中。我对它作为副本关闭没有任何问题。最近(我想这周)还有另一个类似的问题。我试图找到那个,只能找到我链接到的那个。这实际上就是我看到的那个:我认为这里的答案比那个好,但是你提到的旧的答案也很清楚。一个解决方法是围绕parseInt创建自己的包装,比如:const-toInt=(value)=>parseInt(value)代码>。这将按照您的预期工作。然后像这样使用它:['10'、'10'、'10'、'10'、'10'].map(toInt)
你也可以使用lodash的.toInteger()
函数和lodash.map()
parseInt('10',0)//10
实际上没有比base-1更有意义。那也应该是NaN。但我想在一种语言中,null、0、false、undefined和“”几乎是一样的,我可以大致理解为什么if(基数){…}else{…假设基数为10…}
。所以基本上未定义和0都是假的,所以它们取相同的值codepath@kornfridge这在“如果基数未定义或0(或不存在)”下的链接中解释
parseInt('10', 0) // 10
parseInt('10', 1) // NaN
parseInt('10', 2) // 2
parseInt('10', 3) // 3
parseInt('10', 4) // 4