Qual é melhor?
Estou perguntando isso apenas para raspar alguns bytes, pois posso usar + x em vez de número (x). Parsefloat faz algo melhor?
Qual é melhor?
Estou perguntando isso apenas para raspar alguns bytes, pois posso usar + x em vez de número (x). Parsefloat faz algo melhor?
Respostas:
parseFloat
/ parseInt
é para analisar uma string, enquanto Number
/ +
é 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:
parseFloat('3'); // => 3
Number('3'); // => 3
parseFloat('1.501'); // => 1.501
Number('1.501'); // => 1.501
parseFloat('1e10'); // => 10000000000
Number('1e10'); // => 10000000000
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, enquanto Number
fornece NaN
(não um número):
parseFloat('1x'); // => 1
Number('1x'); // => NaN
Além disso, Number
entende a entrada hexadecimal, enquanto parseFloat
não:
parseFloat('0x10'); // => 0
Number('0x10'); // => 16
Mas Number
age de maneira estranha com cadeias vazias ou cadeias contendo apenas espaço em branco:
parseFloat(''); // => NaN
Number(''); // => 0
parseFloat(' \r\n\t'); // => NaN
Number(' \r\n\t'); // => 0
No geral, acho Number
mais razoável, então quase sempre uso Number
pessoalmente (e você verá que muitas das funções internas do JavaScript também usam Number
). 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ê-la 3
, então acho parseFloat
ú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 usar Number
como função:
Number('0x10'); // => 16
+'0x10'; // => 16
Number('10x'); // => NaN
+'10x'; // => NaN
Number('40'); // => 40
+'40'; // => 40
Então eu costumo usar apenas +
para abreviar. Contanto que você saiba o que faz, acho fácil ler.
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
retorna NaN
enquanto parseFloat
analisa "o máximo possível". Se chamado, a sequência vazia Number
retorna 0
enquanto parseFloat retorna NaN
.
Por exemplo:
Number("") === 0 // also holds for false
isNaN(parseFloat("")) === true // and null
isNaN(Number("32f")) === true
parseFloat("32f") === 32
NaN != NaN
embora
NaN != NaN
avalia que é VERDADEIRO - obrigado pela dica!
isNaN(NaN)
retornatrue
Nestes exemplos, você pode ver a diferença:
Number('') = 0;
Number(false) = 0;
Number('1a') = NaN;
parseFloat('') = NaN;
parseFloat(false) = NaN;
parseFloat('1a') = 1;
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
Para string vazia, eles são diferentes.
+""
e Number("")
retorna 0, enquanto parseFloat("")
retorna NaN.
parseFloat()
o resultado certo é que uma string vazia NÃO é o número 0
(leia-se: NaN) enquanto uma string com o caractere "0"
IS 0
;
+x
retorna 0
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ão 0
como resultado
Tanto 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, +""
e Number("")
retorne 0
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;
parseFloat()
ainda é o vencedor.