Qual é melhor?
Estou perguntando isso apenas para raspar alguns bytes, pois posso usar + x em vez de número (x). Parsefloat faz algo melhor?
javascript
optimization
Namanyay Goel
fonte
fonte
Respostas:
A diferença entre parseFloat e Number
parseFloat
/parseInt
é para analisar uma string, enquantoNumber
/+
é para coagir um valor a um número. Eles se comportam de maneira diferente. Mas primeiro vamos ver onde eles se comportam da mesma maneira:Portanto, desde que você tenha entrada numérica padrão, não há diferença. No entanto, se sua entrada começar com um número e depois contiver outros caracteres,
parseFloat
truncará o número da string, enquantoNumber
forneceNaN
(não um número):Além disso,
Number
entende a entrada hexadecimal, enquantoparseFloat
não:Mas
Number
age de maneira estranha com cadeias vazias ou cadeias contendo apenas espaço em branco:No geral, acho
Number
mais razoável, então quase sempre usoNumber
pessoalmente (e você verá que muitas das funções internas do JavaScript também usamNumber
). Se alguém digitar'1x'
, prefiro mostrar um erro do que tratá-lo como se tivesse digitado'1'
. A única vez em que realmente faço uma exceção é quando estou convertendo um estilo para um número; nesse caso,parseFloat
é útil porque os estilos vêm em uma forma como'3px'
, nesse caso, eu quero largar a'px'
peça e apenas obtê-la3
, então achoparseFloat
útil aqui. Mas, na verdade, qual você escolhe depende de você e de quais formas de entrada você deseja aceitar.Observe que usar o
+
operador unário é exatamente o mesmo que usarNumber
como função:Então eu costumo usar apenas
+
para abreviar. Contanto que você saiba o que faz, acho fácil ler.fonte
Number()
como "estranho" Eu consideraria o mais esperado, o espaço em branco é um valor vazio, mas não é nulo / indefinido => 0 é um bom resultado. Big (+) para você para as vitrines de qualquer maneira :)Number('Infinity') === Infinity
considerandoparseInt('Infinity') === NaN
+
(unário mais) para isso, porque se você esquecer um ponto-e-vírgula na linha anterior, uma expressão de adição poderá ser avaliada.A diferença é o que acontece quando a entrada não é um "número adequado".
Number
retornaNaN
enquantoparseFloat
analisa "o máximo possível". Se chamado, a sequência vaziaNumber
retorna0
enquanto parseFloat retornaNaN
.Por exemplo:
fonte
NaN != NaN
emboraNaN != NaN
avalia que é VERDADEIRO - obrigado pela dica!isNaN(NaN)
retornatrue
Nestes exemplos, você pode ver a diferença:
parseFloat é um pouco mais lento porque procura a primeira aparição de um número em uma sequência, enquanto o construtor Number cria uma nova instância de número a partir de sequências que contêm valores numéricos com espaço em branco ou que contêm valores falsos.
PS Se você estiver interessado em algumas soluções universais de conversão de tipos, pode ler o post sobre conversão de tipos no meu blog: http://justsimplejs.blogspot.com/2012/08/data-type-conversion.html
fonte
Para string vazia, eles são diferentes.
+""
eNumber("")
retorna 0, enquantoparseFloat("")
retorna NaN.fonte
parseFloat()
o resultado certo é que uma string vazia NÃO é o número0
(leia-se: NaN) enquanto uma string com o caractere"0"
IS0
;+x
retorna0
não apenas para uma cadeia vazia, mas também para cadeias somente de espaço em branco. Exemplos:+" "
,+"\t\t\t"
,+"\n\n"
- todos eles dão0
como resultadoTanto quanto eu sei, e isso só é ouvido pelos colegas, por isso pode estar totalmente mal informado, que a análise de flutuações é marginalmente mais rápida.
Embora em pesquisas adicionais, parece que essa diferença de desempenho depende do navegador.
http://jsperf.com/parseint-vs-parsefloat/6
Veja esses resultados do jsPerf e faça a sua ligação. (inclui também + x testes)
Conforme observado na resposta de @xdazz,
+""
eNumber("")
retorne0
while,parseFloat("")
retorne-NaN
o. Novamente, eu iria com parseFloat, porque uma string vazia NÃO significa o número 0, apenas uma string com o caractere"0"
significa 0;fonte
parseFloat()
ainda é o vencedor.