Quais são as diferenças entre esta linha:
var a = parseInt("1", 10); // a === 1
e esta linha
var a = +"1"; // a === 1
Este teste jsperf mostra que o operador unário é muito mais rápido na versão atual do chrome, assumindo que é para o node.js.?
Se eu tentar converter strings que não são números, ambos retornam NaN
:
var b = parseInt("test" 10); // b === NaN
var b = +"test"; // b === NaN
Então, quando devo preferir usar parseInt
o plus unário (especialmente no node.js) ???
edit : e qual a diferença para o operador double til ~~
?
javascript
node.js
hereandnow78
fonte
fonte
Respostas:
Por favor, veja esta resposta para um conjunto mais completo de casos
Bem, aqui estão algumas diferenças que eu conheço:
Uma cadeia vazia é
""
avaliada como a0
, enquanto éparseInt
avaliada comoNaN
. IMO, uma string em branco deve ser aNaN
.O unário
+
age mais comoparseFloat
uma vez que também aceita decimais.parseInt
por outro lado, para de analisar quando vê um caractere não numérico, como o período que se destina a ser um ponto decimal.
.parseInt
eparseFloat
analisa e constrói a string da esquerda para a direita . Se eles virem um caractere inválido, ele retornará o que foi analisado (se houver) como um número eNaN
se nenhum foi analisado como um número.O unário,
+
por outro lado, retornaráNaN
se a sequência inteira não for convertível em um número.Como visto no comentário de @Alex K. ,
parseInt
eparseFloat
analisará por caractere. Este hex meios e notações expoente falhará desde ox
ee
são tratados como componentes não numéricos (pelo menos em Base10).O unário
+
irá convertê-los corretamente embora.fonte
+"0xf" != parseInt("0xf", 10)
Math.floor()
, que basicamente corta a parte decimal."2e3"
não é uma representação inteira válida para2000
. No entanto, é um número de ponto flutuante válido:parseFloat("2e3")
será exibido corretamente2000
como resposta. E"0xf"
requer pelo menos a base 16, e é por isso queparseInt("0xf", 10)
retorna0
, enquantoparseInt("0xf", 16)
retorna o valor de 15 que você estava esperando.Math.floor(-3.5) == -4
e~~-3.5 == -3
.A melhor tabela de conversão para qualquer número:
Mostrar snippet de código
fonte
"NaN"
a esta tabela.isNaN
coluna a esta tabela: por exemplo,isNaN("")
é false (ou seja, é considerado um número), masparseFloat("")
éNaN
, o que pode ser uma pegadinha, se você estiver tentando usarisNaN
para validar a entrada antes de passá-la paraparseFloat
'{valueOf: function(){return 42}, toString: function(){return "56"}}'
à lista. Os resultados mistos são interessantes.+
é apenas uma maneira mais curta de escreverNumber
, e as mais furtivas são apenas maneiras loucas de fazer que falham em casos extremos?A tabela na resposta de thg435 que acredito ser abrangente, no entanto, podemos resumir com os seguintes padrões:
true
para 1, mas"true"
paraNaN
.parseInt
é mais liberal para strings que não são dígitos puros.parseInt('123abc') === 123
, enquanto que+
relatóriosNaN
.Number
aceitará números decimais válidos, enquantoparseInt
apenas ignora tudo além do decimal. Assim,parseInt
imita o comportamento C, mas talvez não seja ideal para avaliar a entrada do usuário.parseInt
, sendo um analisador mal projetado , aceita entrada octal e hexadecimal. Unary plus leva apenas hexadecimal.Os valores de falsidade se convertem em
Number
seguir o que faria sentido em C:null
efalse
são zero.""
ir para 0 não segue essa convenção, mas faz bastante sentido para mim.Portanto, acho que se você está validando a entrada do usuário, o unary plus tem um comportamento correto para tudo, exceto que ele aceita decimais (mas, nos meus casos da vida real, estou mais interessado em capturar entrada de email em vez de userId, valor omitido inteiramente etc.), enquanto parseInt é muito liberal.
fonte
Cuidado, parseInt é mais rápido que o operador unário no Node.JS, é falso que + ou | 0 sejam mais rápidos, eles são mais rápidos apenas para elementos NaN.
Veja isso:
fonte
Considere o desempenho também. Fiquei surpreso que
parseInt
supere o unário e mais no iOS :) Isso é útil para aplicativos da Web com alto consumo de CPU. Como regra geral, sugiro que os JS opt-guys considerem qualquer operador JS em detrimento de outro do ponto de vista do desempenho móvel atualmente.Então, vá para o celular primeiro ;)
fonte