来自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]

当前回答

另一个(有效的)权宜之计:

var parseInt10 = function(x){return parseInt(x, 10);}

['0', '1', '2', '10', '15', '57'].map(parseInt10);
//[0, 1, 2, 10, 15, 57]

其他回答

出于这个原因,我认为应该避免使用parseInt。你可以把它包装起来,让它在这些情况下更安全,就像这样:

Const safe = { parseInt: (s, opt) => { Const{基数= 10}= opt ?选择:{}; 返回parseInt(s,基数); } } console.log(['1','2','3'].map(safe.parseInt)); console.log ( ['1', '10', '11']。Map (e =>安全。parseInt(e,{基数:2}) );

Lodash /fp默认将iteratee参数设置为1以避免这些问题。就我个人而言,我发现这些变通方法在避免bug的同时也会产生同样多的bug。我认为,将parseInt列入黑名单以支持更安全的实现是一种更好的方法。

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

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

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

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

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

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

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

例子:

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

我敢打赌这是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 ) } );

另一个(有效的)权宜之计:

var parseInt10 = function(x){return parseInt(x, 10);}

['0', '1', '2', '10', '15', '57'].map(parseInt10);
//[0, 1, 2, 10, 15, 57]