Como parseInt()
e Number()
se comportam de maneira diferente ao converter seqüências de caracteres em números?
fonte
Como parseInt()
e Number()
se comportam de maneira diferente ao converter seqüências de caracteres em números?
Bem, eles são semanticamente diferente , o Number
construtor chamado como função executa tipo de conversão e parseInt
executa a análise , por exemplo:
// parsing:
parseInt("20px"); // 20
parseInt("10100", 2); // 20
parseInt("2e1"); // 2
// type conversion
Number("20px"); // NaN
Number("2e1"); // 20, exponential notation
Lembre-se de que, se parseInt
detectar um zero inicial na string, ele analisará o número na base octal, isso foi alterado no ECMAScript 5, a nova versão do padrão, mas levará muito tempo para entrar nas implementações do navegador (é uma incompatibilidade com o ECMAScript 3) também parseInt
ignorará os caracteres finais que não correspondem a nenhum dígito da base usada atualmente.
O Number
construtor não detecta octais:
Number("010"); // 10
parseInt("010"); // 8, implicit octal
parseInt("010", 10); // 10, decimal radix used
Mas ele pode lidar com números em notação hexadecimal, assim como parseInt
:
Number("0xF"); // 15
parseInt("0xF"); //15
Além disso, um construto amplamente usado para realizar a conversão de tipos numéricos, é o Operador Unário +
(p. 72) , é equivalente a usar o Number
construtor como uma função:
+"2e1"; // 20
+"0xF"; // 15
+"010"; // 10
Number()
lida com octals muito como hexadecimal e binário:Number('0o10') == 8
os dois primeiros oferecerão melhor desempenho, pois retornam um primitivo em vez de um objeto.
fonte
new Number()
é diferente deNumber()
.typeof Number("123") => number
new Number("1") != new Number("1")
. NUNCA USEnew Number
. Nunca, nunca, nunca, nunca.Number("1")
, por outro lado, é perfeitamente razoável.let x = new Number("2"); let y = new Number("2");
e, posteriormente, faço uma verificação de igualdade por qualquer motivo,if (x == y) { doSomething(); }
logicamentedoSomething
deve ser chamado. Mas não vai. Além disso, se você fosse analisar apenas um númerolet x = new Number("2");
,x === 2
seria falso. Essa é uma razão clara para que você não deve usarnew Number
Se você está procurando desempenho, provavelmente os melhores resultados serão obtidos com a mudança à direita bit a bit
"10">>0
. Também multiplique ("10" * 1
) ou não (~~"10"
). Todos eles são muito mais rápidosNumber
eparseInt
. Eles ainda têm "feature" retornando 0 para não argumento de número. Aqui estão os testes de desempenho .fonte
Number
eparseInt
ainda mais lento 99% do que o resto. Além disso, para mim eles são menos atraentes visualmente também :-)parseInt
ouNumber
são mais preferíveis. Se você estiver programando um emulador N64 com milhões de conversões por segundo, considere esses truques.(2**31).toString() >> 0
transbordará para-2147483648
. Você pode usar, em>>>
vez de,>>
para que o JavaScript trate o operando como um número inteiro de 32 bits não assinado , mas qualquer número maior que2**32 - 1
também transbordará.Encontrei dois links de desempenho comparados entre várias formas de conversão
string
paraint
.http://jsben.ch/#/zGJHM
http://phrogz.net/js/string_to_number.html
fonte
Uma pequena diferença é o que eles convertem
undefined
ounull
,enquanto
fonte
Resumo:
parseInt()
:NaN
será retornado.parseInt()
função encontrar um valor não numérico, ela cortará o restante da string de entrada e analisará apenas a parte até o valor não numérico.undefined
ou 0, JS assumirá o seguinte:ES5
especifica que 10 deve ser usado então. No entanto, isso não é suportado por todos os navegadores, portanto , sempre especifique radix se seus números puderem começar com um 0.Number()
:Number()
construtor pode converter qualquer entrada de argumento em um número. Se oNumber()
construtor não puder converter a entrada em um número,NaN
será retornado.Number()
construtor também pode lidar com números hexadecimais, eles precisam começar0x
.Exemplo:
fonte
Eu sempre uso parseInt, mas cuidado com os zeros à esquerda que o forçarão ao modo octal .
fonte
parseInt(value, radix)
que maneira você não tem acidental octal modo conversões, etc.0
, mesmo no modo não estrito. Mas isso foi corrigido e agora os zeros à esquerda são apenas ignorados, o queparseInt("070")
se tornaria70
.parseInt()
.parseInt()
-> Analisa um número no redix especificado.Number()
-> Converte o valor especificado em seu equivalente numérico ou NaN, caso contrário.Portanto, para converter algum valor não numérico em número, devemos sempre usar a função Number ().
por exemplo.
Existem várias maiúsculas e minúsculas nas
parseInt()
funções, pois faz a conversão redix, portanto, devemos evitar o uso da função parseInt () para fins de coerção.Agora, para verificar o clima, o valor fornecido é Numérico ou não, devemos usar a
isNaN()
função nativafonte
parseInt converte em um número inteiro, ou seja, retira decimais. O número não converte em número inteiro.
fonte
É uma boa idéia ficar longe de parseInt e usar Number e Math.round, a menos que você precise de hex ou octal. Ambos podem usar strings. Por que ficar longe disso?
Abate completamente números realmente grandes ou muito pequenos. Curiosamente, funciona normalmente se essas entradas são uma string.
Em vez de me arriscar a encontrar bugs com essa e outras dicas mencionadas, eu evitaria o parseInt, a menos que você precise analisar algo diferente da base 10. Number, Math.round, Math.foor e .toFixed (0) podem faça o mesmo que o parseInt pode ser usado sem esses tipos de erros.
Se você realmente deseja ou precisa usar o parseInt para outras qualidades, nunca o use para converter flutuadores em ints.
fonte