Qual é a diferença entre parseInt () e Number ()?

Respostas:

456

Bem, eles são semanticamente diferente , o Numberconstrutor chamado como função executa tipo de conversão e parseIntexecuta 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 parseIntdetectar 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 parseIntignorará os caracteres finais que não correspondem a nenhum dígito da base usada atualmente.

O Numberconstrutor 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 Numberconstrutor como uma função:

+"2e1";   // 20
+"0xF";   // 15
+"010";   // 10
CMS
fonte
Interessante, o parseInt ignora os caracteres que seguem o número? Porque no meu caso, eu preferiria obter um NaN em vez dos 20 ao converter.
Mark
Sim. Parece que você quer definitivamente Number ()
Gareth
Ok, acho que vou usar o Number (), mas muito obrigado por esclarecer esse ponto e todos esses exemplos! :-)
Marque
11
Obrigado por isso. Esta é a primeira vez que eu vejo NaN. Pode ser útil para algumas pessoas saberem que o NaN é testado com a função isNaN (valor). Apenas usar "if (value == NaN)", por exemplo, não funcionará.
WonderfulDay
11
Number()lida com octals muito como hexadecimal e binário:Number('0o10') == 8
Juan Mendes
22
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.

letronje
fonte
20
new Number()é diferente de Number(). typeof Number("123") => number
Gareth
8
Também new Number("1") != new Number("1"). NUNCA USEnew Number . Nunca, nunca, nunca, nunca. Number("1"), por outro lado, é perfeitamente razoável.
Kragen Javier Sitaker,
18
@Kragen, seria muito mais benéfico para a comunidade se explicou por que você não deve usar "new Number" - em vez de apenas digitando "nunca" 5 vezes ...
ken
11
@ken Comentário muito antigo, mas para futuros visitantes, imagino que seja exatamente o motivo pelo qual eles mencionaram para começar. Eu analiso dois números 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 doSomethingdeve ser chamado. Mas não vai. Além disso, se você fosse analisar apenas um número let x = new Number("2");, x === 2seria falso. Essa é uma razão clara para que você não deve usarnew Number
Tom C
11
@ TomC Você está vendo o resultado de um comentário editado (é o que o ícone de lápis após o comentário indica); anteriormente não havia explicação, apenas uma forte advertência.
ken
15

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 Numbere parseInt. Eles ainda têm "feature" retornando 0 para não argumento de número. Aqui estão os testes de desempenho .

Saulius
fonte
11
A velocidade das várias abordagens parece mudar com as revisões do navegador ao longo do tempo. O teste vinculado também mudou, e a versão mais recente deste comentário está aqui - jsperf.com/number-vs-parseint-vs-plus/39 - felizmente, o site também contém versões anteriores do teste
bobo
@ bobo, com certeza. Por curiosidade verificada com cromo - Numbere parseIntainda mais lento 99% do que o resto. Além disso, para mim eles são menos atraentes visualmente também :-)
Saulius
15
Sempre prefira a clareza do código em vez das otimizações "inúteis". Para a maioria dos casos de uso parseIntou Numbersão mais preferíveis. Se você estiver programando um emulador N64 com milhões de conversões por segundo, considere esses truques.
Noughtman 20/05
11
A pergunta é sobre comportamento, a discussão sobre desempenho é fora de tópico.
pneumatics
11
Observe que isso não pode ser usado para números inteiros grandes - especificamente números inteiros que não cabem em um número inteiro de 32 bits assinado - porque em JavaScript, os operadores bit a bit tratam seus operandos como uma sequência de 32 bits, e não como decimal, números hexadecimais ou octais. Daí (2**31).toString() >> 0transbordará 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 - 1também transbordará.
hasc
6

Uma pequena diferença é o que eles convertem undefinedou null,

Number() Or Number(null) // returns 0

enquanto

parseInt() Or parseInt(null) // returns NaN
Naeem Shaikh
fonte
6

Resumo:

parseInt():

  • Pega uma string como primeiro argumento, a raiz (Um inteiro que é a base de um sistema numérico, por exemplo, decimal 10 ou binário 2) como segundo argumento
  • A função retorna um número inteiro, se o primeiro caractere não puder ser convertido em um número NaNserá retornado.
  • Se a 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.
  • Se a raiz for undefinedou 0, JS assumirá o seguinte:
    • Se a sequência de entrada começar com "0x" ou "0X", a raiz é 16 (hexadecimal), o restante da sequência é analisado em um número.
    • Se o valor de entrada começar com 0, o radical pode ser 8 (octal) ou 10 (decimal). Qual raiz escolhida depende da implementação do mecanismo JS. ES5especifica 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.
    • Se o valor de entrada começar com qualquer número, a raiz será 10

Number():

  • O 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, NaNserá retornado.
  • O Number()construtor também pode lidar com números hexadecimais, eles precisam começar 0x.

Exemplo:

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

Willem van der Veen
fonte
5

Eu sempre uso parseInt, mas cuidado com os zeros à esquerda que o forçarão ao modo octal .

Diodous - James MacFarlane
fonte
35
Eu acho que é sempre uma boa idéia para fornecer uma raiz de parseInt(value, radix)que maneira você não tem acidental octal modo conversões, etc.
awesomo
Os zeros à esquerda o forçarão ao modo octal no ECMAScript 3. O ECMAScript 5 o analisará 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.
Piotrek Hryciuk
2
Você também deve usar um linter que o avisará para fornecer um valor de raiz parseInt().
Justin
2

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

Atishay Baid
fonte
1

parseInt converte em um número inteiro, ou seja, retira decimais. O número não converte em número inteiro.

Johan Rylander
fonte
1

É 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.

kagronick
fonte