Map,parseInt的奇怪行为

Ben*_*ick 93 javascript functional-programming

可能重复:
javascript - Array.map和parseInt

在twitter上看到了这个奇怪的JavaScript行为示例

['10','10','10','10','10'].map(parseInt)
Run Code Online (Sandbox Code Playgroud)

评估为

[10, NaN, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

有人可以解释这种行为吗?我用铬和萤火虫验证了它

['10','10','10','10','10'].map(function(x){return parseInt(x);})
Run Code Online (Sandbox Code Playgroud)

正确返回10的数组作为整数.这是不正确使用map(),parseInt的错误还是其他什么?

Vis*_*ioN 109

parseInt 接收两个参数:string和radix:

var intValue = parseInt(string[, radix]);

maphandler的第二个参数是index:

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

  • 其余的并不是严格地"返回索引",但它的效果相同,因为基数"x"中的任何数字"x"都表示为字符串"10".请注意,如果你的数组中有超过36个元素,那么你将会在最后获得更多的NaN. (3认同)
  • 啊,这是有道理的,所以第二个数字试图在基数1评估并失败,其余的只会返回索引?那讲得通.谢谢. (2认同)
  • @VincentWasteels是的,有点.你可以使用`[...].map(parseFloat)`或`[...].map(Number)`.两者都会将字符串转换为给定数组中的数字.然而``parseFloat`和`Number`的工作方式与`parseInt`略有不同:两者都会抛出浮点数和整数,而`Number`会转换以数字开头的字符串,并将其他字符包含在`NaN`中(例如`10abc` ).`Number`也可以将所有空格和不可打印字符转换为'0`.作为一个字符串到数字转换器都工作得很好,如果只有你*真的*需要使用`parseInt`:然后使用匿名函数作为`map`参数. (2认同)

Jos*_*ber 36

parseInt 使用map传递的前两个参数,并使用第二个参数指定基数.

以下是您的代码中发生的情况:

parseInt('10', 0) // 10
parseInt('10', 1) // NaN
parseInt('10', 2) // 2
parseInt('10', 3) // 3
parseInt('10', 4) // 4
Run Code Online (Sandbox Code Playgroud)

下面是一个MDN链接parseInt:https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/parseInt.

  • `parseInt('10',0)// 10`实际上没有比base-1更有意义.那也应该是NaN.但我想在一种语言中,null,0,false,undefined和''几乎是一样的,我可以解释为什么.`if(radix){...} else {...假设基数为10 ...}`.所以基本上未定义和0都是假的,所以他们采用相同的代码路径 (4认同)

Jus*_*ner 5

来自MDN:

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

parseInt()有两个论点.价值和基数.这意味着parseInt()使用非预期的参数调用该函数.