Qual é a melhor maneira de converter um número em uma string em JavaScript?


519

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:

  1. String(n)

  2. n.toString()

  3. ""+n

  4. n+""

Respostas:


516

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 '' + numamostra.


58
Há casos em que a conversão pode não retornar uma resposta preferível: '' + 123e-50retorna "1.23e-48".
Hongymagic 30/10/2013

21
@ hongymagic: essa resposta é de fato a única concebível: o número não se importa nem sabe como foi digitado, e a representação impressa padrão está com exatamente um dígito antes do ponto.
Svante 02/09

4
Fiz o teste em jsben.ch/ghQYR , toda vez que ele me mostra um resultado diferente!
Maryam Saeidi

2
Eu gosto desta resposta porque a null foonão gera um erro.
ttugates

2
@MaryamSaeidi: Usar o teste jsperf.com de drublic acima parece mais consistente.
Giraldi

364

Na minha opinião, n.toString()leva o prêmio por sua clareza, e não acho que isso acarreta custos adicionais.


Ele carrega alguma sobrecarga, embora seja insignificante nas versões recentes do navegador. No Firefox Quantum, pelo menos
peterchaula

11
Isso não é seguro. n pode ser nulo ou indefinido.
David.pfx 13/11

20
@ david.pfx a pergunta pergunta como converter valores numéricos em uma string. Fornecer exemplos de valores não numéricos (por exemplo null, undefined) que não funcionam com esta resposta dificilmente a torna "insegura".
Michael Martin-Smucker

5
@ MichaelMartin-Smucker: Se você escreve muito JS, percebe que as coisas raramente são tão cortadas e secas. A pergunta estava aberta e, na IMO, uma boa resposta deveria pelo menos reconhecer o problema de uma sequência que é realmente nula ou indefinida. YMMV.
David.pfx

@ david.pfx Eu escrevi MUITOS js e não me lembro da última vez em que precisei de um número como uma string e qualquer coisa, exceto um número como uma string, seria suficiente. Essa é a resposta correta. Não há resposta para o manuseio nullou, undefinedcomo é 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.
George Reith

73

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()ou String(n). String(n)provavelmente é uma escolha melhor porque não falhará se nfor nulo ou indefinido.


12
A questão era sobre a conversão de números, não sobre a conversão de números, ou null, ou undefined. Se né nullou é undefineddevido 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 usar String(n)para mascarar um erro.
Matt Wallis

1
String(n)é bom para usar em um estilo funcional, por exemplo, com a combinação de sublinhado _.compose(funcThatNeedsAStringParam, String).
Rik Martins

2
String (null) não trava o programa, mas retornará a string literal "null", que provavelmente não é o que você deseja. Se os dados puderem ser nulos legitimamente, você precisará manipulá-los explicitamente.
Peter Smartt

1
@ MattWallis Eu acho que deve ser uma decisão do desenvolvedor, não do respondente, você não acha?
forresthopkinsa

31

... O analisador de JavaScript tenta analisar a notação de ponto em um número como um literal de ponto flutuante.

2..toString(); // the second point is correctly recognized
2 .toString(); // note the space left to the dot
(2).toString(); // 2 is evaluated first

Fonte


17

Língua na bochecha, obviamente:

var harshNum = 108;
"".split.call(harshNum,"").join("");

Ou no ES6, você pode simplesmente usar seqüências de caracteres de modelo :

var harshNum = 108;
`${harshNum}`;

Se eu executar os benchmarks com modelos ES6, às vezes até será mais rápido que o '' + numbermé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.
Nico Van Belle

15

Outras respostas já cobriam outras opções, mas eu prefiro esta:

s = `${n}`

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 .


Também é seguro se n não for um número.
David.pfx 13/11

Mas então é n.toString()assim, não é?
amn

1
@amn se né undefinedele lançará um erro de sintaxe usando.toString()
Jee Mok

Isso não dá apenas o mesmo resultado que String(n)em todos os casos? A única diferença é que é menos claro.
Bennett McElwee

E muito mais lento.
Adrian Bartholomew

12

A maneira mais simples de converter qualquer variável em uma string é adicionar uma string vazia a essa variável.

5.41 + ''    // Result: the string '5.41'
Math.PI + '' // Result: the string '3.141592653589793'

2
Note que ele precisa ser parens dentro: (5.41 + '')para usar os métodos de String como .substring()e outros
Gjaa

Por que isso precisa ser observado?
Adrian Bartholomew

7

Se 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étodo

number.toFixed( [digits] )

digits é o número de dígitos a serem exibidos após a casa decimal.


2
Inseguro, a menos que você saiba que é um número.
David.pfx 13/11

6

Usei https://jsperf.com para criar um caso de teste para os seguintes casos:

number + ''
`${number}`
String(number)
number.toString()

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)e number.toString()são cerca de 95% mais lentos que a opção mais rápida.

testes de desempenho, descrição acima


2

Gosto dos dois primeiros, pois são mais fáceis de ler. Eu costumo usarString(n) mas é apenas uma questão de estilo do que qualquer outra coisa.

Ou seja, a menos que você tenha uma linha como

var n = 5;
console.log ("the number is: " + n);

o que é muito auto-explicativo


2

Eu acho que depende da situação, mas de qualquer maneira você pode usar o .toString()método, pois é muito claro para entender.


2

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


1

Se eu tivesse que levar tudo em consideração, sugerirei seguir

var myint = 1;
var mystring = myint + '';
/*or int to string*/
myint = myint + ''

IMHO, é a maneira mais rápida de converter para string. Corrija-me se eu estiver enganado.


1

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.

'' + xchama .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, como Object.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:

/**
 * Safely casts any value to string. Null and undefined are converted to ''.
 * @param  {*} value
 * @return {string}
 */
function string (str) {
  return value == null ? '' : (typeof value === 'object' && !value.toString ? '[object]' : String(value));
}

1

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:

123..toString()
123 .toString() // space before the dot 123.0.toString()
(123).toString()

1

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


0

Se você está curioso para saber qual é o melhor desempenho, verifique isso onde eu comparo todas as diferentes conversões Number -> String.

Parece 2+''ou 2+""é o mais rápido.

https://jsperf.com/int-2-string


0

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 " + numno navegador popular Google Chrome.


0

O método toFixed()também resolve o objetivo.

var n = 8.434332;
n.toFixed(2)  // 8.43

0

Você pode chamar o Numberobjeto e depois chamar toString().

Number.call(null, n).toString()

Você pode usar esse truque para outros objetos nativos javascript.


0

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 .


0

Vou reeditar isso com mais dados quando tiver tempo, pois agora está tudo bem ...

Teste no nodejs v8.11.2: 06/06/2018

let i=0;
    console.time("test1")
    for(;i<10000000;i=i+1){
    	const string = "" + 1234;
    }
    console.timeEnd("test1")
    
    i=0;
    console.time("test1.1")
    for(;i<10000000;i=i+1){
    	const string = '' + 1234;
    }
    console.timeEnd("test1.1")
    
    i=0;
    console.time("test1.2")
    for(;i<10000000;i=i+1){
    	const string = `` + 1234;
    }
    console.timeEnd("test1.2")
    
    i=0;
    console.time("test1.3")
    for(;i<10000000;i=i+1){
    	const string = 1234 +  '';
    }
    console.timeEnd("test1.3")
    
    
    i=0;
    console.time("test2")
    for(;i<10000000;i=i+1){
    	const string = (1234).toString();
    }
    console.timeEnd("test2")
    
    
    i=0;
    console.time("test3")
    for(;i<10000000;i=i+1){
    	const string = String(1234);
    }
    console.timeEnd("test3")
    
    
    i=0;
    console.time("test4")
    for(;i<10000000;i=i+1){
    	const string = `${1234}`;
    }
    console.timeEnd("test4")
    
    i=0;
    console.time("test5")
    for(;i<10000000;i=i+1){
    	const string = 1234..toString();
    }
    console.timeEnd("test5")
    
    i=0;
    console.time("test6")
    for(;i<10000000;i=i+1){
    	const string = 1234 .toString();
    }
    console.timeEnd("test6")

resultado

test1: 72.268ms
test1.1: 61.086ms
test1.2: 66.854ms
test1.3: 63.698ms
test2: 207.912ms
test3: 81.987ms
test4: 59.752ms
test5: 213.136ms
test6: 204.869ms

Yay - test4 é o que eu uso regularmente !!
Adrian Bartholomew

0

Parece resultados semelhantes ao usar o node.js. Eu executei este script:

let bar;
let foo = ["45","foo"];

console.time('string concat testing');
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo;
}
console.timeEnd('string concat testing');


console.time("string obj testing");
for (let i = 0; i < 10000000; i++) {
    bar = String(foo);
}
console.timeEnd("string obj testing");

console.time("string both");
for (let i = 0; i < 10000000; i++) {
    bar = "" + foo + "";
}
console.timeEnd("string both");

e obteve os seguintes resultados:

 node testing.js
string concat testing: 2802.542ms
string obj testing: 3374.530ms
string both: 2660.023ms

Tempos similares cada vez que eu o executei.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.