Qual é a melhor maneira de converter um número em uma string (em termos de vantagem de velocidade, vantagem de clareza, vantagem de memória etc.)?
Alguns exemplos:
String(n)
n.toString()
""+n
n+""
fonte
Qual é a melhor maneira de converter um número em uma string (em termos de vantagem de velocidade, vantagem de clareza, vantagem de memória etc.)?
Alguns exemplos:
String(n)
n.toString()
""+n
n+""
como isso:
var foo = 45;
var bar = '' + foo;
Na verdade, embora eu normalmente faça isso dessa maneira por conveniência simples, mais de 1.000s de iterações parecem velocidade bruta, há uma vantagem para.toString()
Consulte Testes de desempenho aqui (não por mim, mas encontrado quando fui escrever o meu): http://jsben.ch/#/ghQYR
Mais rápido com base no teste JSPerf acima: str = num.toString();
Deve-se notar que a diferença de velocidade não é excessivamente significativa quando você considera que pode fazer a conversão de qualquer maneira 1 milhão de vezes em 0,1 segundos .
Atualização: a velocidade parece variar bastante de acordo com o navegador. No Chrome, num + ''
parece ser o mais rápido com base neste teste http://jsben.ch/#/ghQYR
Atualização 2: Novamente, com base no meu teste acima, observe que o Firefox 20.0.1 executa .toString()
cerca de 100 vezes mais devagar que a '' + num
amostra.
'' + 123e-50
retorna"1.23e-48"
.null foo
não gera um erro.Na minha opinião,
n.toString()
leva o prêmio por sua clareza, e não acho que isso acarreta custos adicionais.fonte
null
,undefined
) que não funcionam com esta resposta dificilmente a torna "insegura".null
ou,undefined
como é específico da aplicação, embora eu imagine(n || defaultNumber).toString()
que seja o que a maioria das pessoas gostaria em uma situação como essa, discordo totalmente de que deveríamos trabalhar em todas as perguntas. Tratava-se de converter números em seqüências de caracteres, boa arquitetura e outras conversões de tipo, quando necessário, são lições separadas.Conversões explícitas são muito claras para alguém que é novo no idioma. O uso de coerção de tipo, como outros sugeriram, leva à ambiguidade se um desenvolvedor não estiver ciente das regras de coerção. Em última análise, o tempo do desenvolvedor é mais caro do que o tempo da CPU, então eu otimizaria para o primeiro ao custo do último. Dito isto, neste caso, a diferença é provavelmente insignificante, mas se não, tenho certeza de que existem alguns compressores JavaScript decentes que otimizarão esse tipo de coisa.
Portanto, pelas razões acima, eu usaria:
n.toString()
ouString(n)
.String(n)
provavelmente é uma escolha melhor porque não falhará sen
for nulo ou indefinido.fonte
null
, ouundefined
. Sen
énull
ou éundefined
devido a um erro no meu programa, eu preferiria que meu programa falhasse nesse estado, para me dar uma chance melhor de encontrar e corrigir o erro. Falhas no programa são presentes para o programador, para ajudá-lo a encontrar os bugs :-). A alternativa é fornecer um software que não funcione conforme o projetado, tendo cuidadosamente examinado os bugs. Portanto, não sou fã de usarString(n)
para mascarar um erro.String(n)
é bom para usar em um estilo funcional, por exemplo, com a combinação de sublinhado_.compose(funcThatNeedsAStringParam, String)
.Fonte
fonte
Língua na bochecha, obviamente:
Ou no ES6, você pode simplesmente usar seqüências de caracteres de modelo :
fonte
'' + number
método. Dito isto, os resultados desses benchmarks variam muito ao executá-los várias vezes, portanto, não tenho certeza se eles devem ser levados muito a sério.Outras respostas já cobriam outras opções, mas eu prefiro esta:
Curto, sucinto, já usado em muitos outros lugares (se você estiver usando uma estrutura moderna / versão ES), por isso é uma aposta segura que qualquer programador entenderá.
Não que isso (geralmente) tenha muita importância, mas também parece estar entre os mais rápidos em comparação com outros métodos .
fonte
n.toString()
assim, não é?n
éundefined
ele lançará um erro de sintaxe usando.toString()
String(n)
em todos os casos? A única diferença é que é menos claro.A maneira mais simples de converter qualquer variável em uma string é adicionar uma string vazia a essa variável.
fonte
(5.41 + '')
para usar os métodos de String como.substring()
e outrosSe você precisar formatar o resultado para um número específico de casas decimais, por exemplo, para representar a moeda, precisará de algo como o
toFixed()
métododigits
é o número de dígitos a serem exibidos após a casa decimal.fonte
Usei https://jsperf.com para criar um caso de teste para os seguintes casos:
https://jsperf.com/number-string-conversion-speed-comparison
Em 24 de julho de 2018, os resultados dizem que
number + ''
é o mais rápido no Chrome, no Firefox, vinculado a literais de cadeias de caracteres de modelo.Ambos
String(number)
enumber.toString()
são cerca de 95% mais lentos que a opção mais rápida.fonte
Gosto dos dois primeiros, pois são mais fáceis de ler. Eu costumo usar
String(n)
mas é apenas uma questão de estilo do que qualquer outra coisa.Ou seja, a menos que você tenha uma linha como
o que é muito auto-explicativo
fonte
Eu acho que depende da situação, mas de qualquer maneira você pode usar o
.toString()
método, pois é muito claro para entender.fonte
.toString () é a função de conversão de texto incorporada, não sou especialista nesses detalhes, mas sempre que comparamos a conversão de tipos incorporada versus metodologias explícitas, as soluções internas sempre preferidas.
fonte
Se eu tivesse que levar tudo em consideração, sugerirei seguir
IMHO, é a maneira mais rápida de converter para string. Corrija-me se eu estiver enganado.
fonte
A única solução válida para quase todos os casos existentes e futuros possíveis (entrada é número, nulo, indefinido, símbolo, qualquer outra coisa) é
String(x)
. Não use três maneiras de operação simples, baseando-se em suposições de tipo de valor, como "aqui eu converto definitivamente número em string e aqui definitivamente booleano em string".Explicação:
String(x)
lida com valores nulos, indefinidos, Símbolos [qualquer coisa] e solicita.toString()
objetos.'' + x
chama.valueOf()
x (conversão para número), lança Símbolos, pode fornecer resultados dependentes da implementação.x.toString()
lança nulos e indefinidos.Nota:
String(x)
ainda falhará em objetos sem protótipo, comoObject.create(null)
.Se você não gosta de strings como 'Hello, undefined' ou deseja oferecer suporte a objetos sem protótipo, use a seguinte função de conversão de tipo:
fonte
Com literais numéricos, o ponto para acessar uma propriedade deve ser diferenciado do ponto decimal. Isso deixa você com as seguintes opções se desejar chamar String () no número literal 123:
fonte
A seguir estão os métodos para converter um Número Inteiro em String em JS
Os métodos são organizados na ordem decrescente de desempenho.
(Os resultados dos testes de desempenho são dados por @DarckBlezzer em sua resposta)
var num = 1
Método 1:
num = `$ {num}`
Método 2:
num = num + ''
Método 3:
num = String (num)
Método 4:
num = num.toString ()
Nota: Você não pode ligar diretamente para tostring () de um número
Por exemplo: 2.toString () lançará Untaught SyntaxError : token inválido ou inesperado
fonte
Se você está curioso para saber qual é o melhor desempenho, verifique isso onde eu comparo todas as diferentes conversões Number -> String.
Parece
2+''
ou2+""
é o mais rápido.https://jsperf.com/int-2-string
fonte
Também podemos usar o construtor String . De acordo com esse benchmark , é a maneira mais rápida de converter um número em string no Firefox 58, embora seja mais lento que
" + num
no navegador popular Google Chrome.fonte
O método
toFixed()
também resolve o objetivo.fonte
Você pode chamar o
Number
objeto e depois chamartoString()
.Number.call(null, n).toString()
Você pode usar esse truque para outros objetos nativos javascript.
fonte
Apenas deparei com isso recentemente, os métodos 3 e 4 não são apropriados, porque a maneira como as seqüências de caracteres são copiadas e depois montadas. Para um programa pequeno, esse problema é insignificante, mas para qualquer aplicativo Web real, essa ação em que precisamos lidar com manipulações de strings de frequência pode afetar o desempenho e a legibilidade.
Aqui está o link da leitura .
fonte
Vou reeditar isso com mais dados quando tiver tempo, pois agora está tudo bem ...
Teste no nodejs v8.11.2: 06/06/2018
resultado
fonte
Parece resultados semelhantes ao usar o node.js. Eu executei este script:
e obteve os seguintes resultados:
Tempos similares cada vez que eu o executei.
fonte