来自Mozilla开发人员网络:
[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。
parseInt
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
中的回调函数Array.map具有 三个 参数:
Array.map
在您链接到的同一Mozilla页面上:
回调使用三个参数来调用:元素的值,元素的索引和要遍历的Array对象。”
因此,如果调用parseInt实际上需要 两个 参数的函数,则第二个参数将是元素的索引。
在这种情况下,您最终parseInt依次调用基数0、1和2。第一个与不提供参数相同,因此默认基于输入(在本例中为10)。以1为底的数字是不可能的,以3为底的数字不是有效数字:
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。开头,则猜测为十六进制。)
0x