Como parseInt()
e Number()
se comportam de maneira diferente ao converter seqüências de caracteres em números?
Como parseInt()
e Number()
se comportam de maneira diferente ao converter seqüências de caracteres em números?
Respostas:
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
typeof parseInt("123") => number
typeof Number("123") => number
typeof new Number("123") => object (Number primitive wrapper object)
os dois primeiros oferecerão melhor desempenho, pois retornam um primitivo em vez de um objeto.
new Number()
é diferente de Number()
. 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(); }
logicamente doSomething
deve ser chamado. Mas não vai. Além disso, se você fosse analisar apenas um número let 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ápidos Number
e parseInt
. Eles ainda têm "feature" retornando 0 para não argumento de número. Aqui estão os testes de desempenho .
Number
e parseInt
ainda mais lento 99% do que o resto. Além disso, para mim eles são menos atraentes visualmente também :-)
parseInt
ou Number
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 que 2**32 - 1
também transbordará.
Encontrei dois links de desempenho comparados entre várias formas de conversão string
para int
.
parseInt(str,10)
parseFloat(str)
str << 0
+str
str*1
str-0
Number(str)
Uma pequena diferença é o que eles convertem undefined
ou null
,
Number() Or Number(null) // returns 0
enquanto
parseInt() Or parseInt(null) // returns NaN
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 o Number()
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çar 0x
.console.log(parseInt('0xF', 16)); // 15
// z is no number, it will only evaluate 0xF, therefore 15 is logged
console.log(parseInt('0xFz123', 16));
// because the radix is 10, A is considered a letter not a number (like in Hexadecimal)
// Therefore, A will be cut off the string and 10 is logged
console.log(parseInt('10A', 10)); // 10
// first character isnot a number, therefore parseInt will return NaN
console.log(parseInt('a1213', 10));
console.log('\n');
// start with 0X, therefore Number will interpret it as a hexadecimal value
console.log(Number('0x11'));
// Cannot be converted to a number, NaN will be returned, notice that
// the number constructor will not cut off a non number part like parseInt does
console.log(Number('123A'));
// scientific notation is allowed
console.log(Number('152e-1')); // 15.21
Eu sempre uso parseInt, mas cuidado com os zeros à esquerda que o forçarão ao modo octal .
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 que parseInt("070")
se tornaria 70
.
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.
Number("")//0
parseInt("")//NaN
Number("123")//123
parseInt("123")//123
Number("123ac") //NaN,as it is a non numeric string
parsInt("123ac") //123,it parse decimal number outof string
Number(true)//1
parseInt(true) //NaN
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 nativa
parseInt converte em um número inteiro, ou seja, retira decimais. O número não converte em número inteiro.
É 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?
parseInt(0.001, 10)
0
parseInt(-0.0000000001, 10)
-1
parseInt(0.0000000001, 10)
1
parseInt(4000000000000000000000, 10)
4
Abate completamente números realmente grandes ou muito pequenos. Curiosamente, funciona normalmente se essas entradas são uma string.
parseInt("-0.0000000001", 10)
0
parseInt("0.0000000001", 10)
0
parseInt("4000000000000000000000", 10)
4e+21
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.