Na Rede de Desenvolvedores Mozilla :
[1,4,9].map(Math.sqrt)
produzirá:
[1,2,3]
Por que, então, faz isso:
['1','2','3'].map(parseInt)
produza isso:
[1, NaN, NaN]
Eu testei no Firefox 3.0.1 e no Chrome 0.3 e apenas como um aviso, sei que isso não é uma funcionalidade entre navegadores (sem IE).
Eu descobri que o seguinte realizará o efeito desejado. No entanto, ainda não explica o comportamento incorreto de parseInt
.
['1','2','3'].map(function(i){return +i;}) // returns [1,2,3]
javascript
Brad
fonte
fonte
.map(parseFloat)
porque leva apenas um parâmetro..map(Number)
.Respostas:
A função de retorno de chamada em
Array.map
tem três parâmetros:Na mesma página do Mozilla à qual você vinculou:
Portanto, se você chamar uma função
parseInt
que realmente espera dois argumentos, o segundo argumento será o índice do elemento.Nesse caso, você acabou chamando
parseInt
com as raízes 0, 1 e 2. O primeiro é o mesmo que não fornecer o parâmetro, portanto, padronizou com base na entrada (base 10, neste caso). A base 1 é uma base numérica impossível e 3 não é um número válido na base 2:Portanto, neste caso, você precisa da função wrapper:
ou com a sintaxe do ES2015 +:
(Nos dois casos, é melhor fornecer explicitamente um radical
parseInt
como mostrado, porque, caso contrário, ele adivinha o radical com base na entrada. Em alguns navegadores mais antigos, um 0 inicial fazia com que adivinhasse octal, o que tendia a ser problemático. adivinhe hex se a string começar com0x
.)fonte
map
está passando um segundo argumento, que (em muitos casos) está atrapalhando oparseInt
parâmetro radix.Se você estiver usando sublinhado, poderá:
['10','1','100'].map(_.partial(parseInt, _, 10))
Ou sem sublinhado:
['10','1','100'].map(function(x) { return parseInt(x, 10); });
fonte
Você pode resolver esse problema usando Number como função iteratee:
Sem o novo operador, o Number pode ser usado para realizar a conversão de tipos. No entanto, difere de parseInt: não analisa a sequência e retorna NaN se o número não puder ser convertido. Por exemplo:
fonte
Aposto que é algo estranho acontecendo com o segundo parâmetro do parseInt, o radical. Por que está rompendo com o uso do Array.map e não quando você o chama diretamente, eu não sei.
fonte
Você pode usar a função de seta ES2015 / ES6 e apenas passar o número para o parseInt. O valor padrão para a raiz será 10
Ou você pode especificar explicitamente radix para melhor legibilidade do seu código.
No exemplo acima, o radical definido explicitamente para 10
fonte
outra solução rápida (funcionando):
fonte
parseInt
O IMHO deve ser evitado por esse motivo. Você pode envolvê-lo para torná-lo mais seguro nesses contextos como este:O lodash / fp limita os argumentos de iteração para 1 por padrão para evitar essas dicas. Pessoalmente, eu encontrei essas soluções alternativas para criar tantos erros quanto eles evitarem. A lista negra a
parseInt
favor de uma implementação mais segura é, penso eu, uma abordagem melhor.fonte