来自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的错误行为。
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
数组中的回调函数。Map有三个参数:
从您链接到的同一Mozilla页面:
callback调用时带有三个参数:元素的值、元素的索引和被遍历的Array对象。”
如果你调用一个函数parseInt它需要两个参数,第二个参数将是元素的下标。
在这种情况下,你最后依次调用基数为0,1和2的parseInt。第一个与不提供参数相同,因此它基于输入(在本例中以10为基数)进行默认设置。以1为基数是一个不可能的数字基数,以2为基数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
所以在本例中,你需要wrapper函数:
['1','2','3'].map(function(num) { return parseInt(num, 10); });
或使用ES2015+语法:
['1','2','3'].map(num => parseInt(num, 10));
(在这两种情况下,最好是显式地为parseInt提供一个基数,因为否则它会根据输入猜测基数。在一些较旧的浏览器中,前导0会导致它猜测八进制,这往往是有问题的。如果字符串以0x开头,它仍然会猜测十六进制。)
另一个(有效的)权宜之计:
var parseInt10 = function(x){return parseInt(x, 10);}
['0', '1', '2', '10', '15', '57'].map(parseInt10);
//[0, 1, 2, 10, 15, 57]