javascript - 为什么 parseInt 使用 Array#map 会产生 NaN ?

标签 javascript

来自Mozilla Developer Network :

[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 page您链接到的:

callback is invoked with three arguments: the value of the element, the index of the element, and the Array object being traversed."

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

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

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 开头,它仍然会猜测十六进制。)

关于javascript - 为什么 parseInt 使用 Array#map 会产生 NaN ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28721548/

相关文章:

javascript - Summernote:启用空中模式以及默认工具栏

javascript - 如何在浏览器中使用ethereumjs-tx

javascript - 鼠标悬停在节点文本下划线

javascript - 无法使用 jquery 检索文本框的值

javascript - 在 React setState 函数中使用 e.target.value 的问题

javascript - D3 中 .remove() 的临时替代方案

javascript - 使用 Java 脚本和多维数组

javascript - Google Drive OAuth 在某些浏览器上触发 origin_mismatch

javascript - Coffeescript 图像切换器?

javascript - 忽略其中包含特定单词的模式