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

其他回答

map会传递第二个参数,这(在很多情况下)会搞乱parseInt的radix参数。

如果你使用下划线,你可以这样做:

][报告的f1、’100’.map(_。部分(parseInt, _, 10)

或不带下划线:

['10','1','100'].map(function(x) { return parseInt(x, 10); });

我敢打赌这是parseInt的第二个参数,基数的问题。为什么它打破了数组的使用。而不是你什么时候直接叫它,我不知道。

//  Works fine
parseInt( 4 );
parseInt( 9 );

//  Breaks!  Why?
[1,4,9].map( parseInt );

//  Fixes the problem
[1,4,9].map( function( num ){ return parseInt( num, 10 ) } );

你可以这样解决这个问题:

array.map(x => parseInt(x))

例子:

var arr = [“3”, “5”, “7”]; console.log( arr.map(x => parseInt(x)) );

你可以使用Number作为迭代函数来解决这个问题:

var a =[’0’转包给“1”,(2)、技术性、’57’]. map(编号); 游戏机。log ((a);

如果没有new操作符,Number可用于执行类型转换。但是,它与parseInt不同:它不解析字符串,如果数字不能转换则返回NaN。例如:

console.log(parseInt(“19asdf”)); console.log(Number(“19asf”));

你可以使用箭头函数ES2015/ES6,并将number传递给parseInt。基数的默认值为10

[10, 20, 30].map(x => parseInt(x))

或者您可以显式地指定基数以提高代码的可读性。

[10, 20, 30].map(x => parseInt(x, 10))

在上面的例子中,基数显式设置为10