Encontrei três maneiras de converter uma variável String
no JavaScript.
Procurei essas três opções no código-fonte do jQuery e todas elas estão em uso .
Gostaria de saber se existem diferenças entre eles:
value.toString()
String(value)
value + ""
Todos eles produzem a mesma saída, mas um deles é melhor que os outros?
Eu diria que + ""
tem a vantagem de salvar alguns personagens, mas essa não é a grande vantagem, mais alguma coisa?
javascript
jquery
string
gdoron está apoiando Monica
fonte
fonte
toString()
seria o caminho a seguir.toString
é semanticamente a maneira mais clara de auto-documentar o fato de que você está tentando obter uma string equivalente a um objeto.String(...)
é um pouco obtuso, evalue + ""
é um pouco de hack. Ele também oferece a capacidade de substituir o padrãotoString
por uma implementação personalizada, se você precisar, suponho, como um benefício secundário menor.+ ""
é o mais rápido de acordo com o jsperf, então ... faz de outra maneira, eu acho.Respostas:
Eles se comportam de maneira diferente quando
value
estãonull
.null.toString()
gera um erro - Não é possível chamar o método 'toString' de nullString(null)
retorna - "nulo"null + ""
também retorna - "null"Um comportamento muito semelhante acontece se
value
forundefined
(consulte a resposta de jbabey ).Fora isso, há uma diferença insignificante de desempenho, que, a menos que você os esteja usando em loops enormes, não vale a pena se preocupar.
fonte
toString()
quando ainda não tiver verificadonull
.null
ouundefined
para a tela é um comportamento mais desejável, em seguida, um erro de javascript ...v + ''
retorna resultado incorreto se v tiver os métodos toString () e valueOf (). A concatenação ignorará toString () e usará valueOf (). Exemplo de uma classe para a qual a concatenação falha: github.com/processing-js/processing-js/blob/…Existem diferenças, mas elas provavelmente não são relevantes para sua pergunta. Por exemplo, o protótipo toString não existe em variáveis indefinidas, mas você pode converter indefinido em uma string usando os outros dois métodos:
http://jsfiddle.net/f8YwA/
fonte
String()
. Exemplo:String(test);
lançaUncaught ReferenceError: test is not defined
, enquantovar test; String(test);
resultará em"undefined"
.Eles se comportam da mesma forma, mas
toString
também fornecem uma maneira de converter um número de cadeias binárias, octais ou hexadecimais:Exemplo:
fonte
De acordo com este teste JSPerf , eles diferem na velocidade. Mas, a menos que você os use em grandes quantidades, qualquer um deles deve ter um bom desempenho.
Para completar: Como asawyer já mencionado, você também pode usar o
.toString()
método.fonte
new String()
retorna um objeto não umString
new String()
retorna um objeto yes.String()
, no entanto, retorna uma sequência, que é a que está em questão.new String(blarg)
fornece umString
objeto que você pode chamartoString()
. No meu depurador do Chrome, eles efetivamente resultam no mesmo tipo de objeto, exceto na referida diferença.Além de tudo o que foi dito acima, deve-se observar que, para um valor definido
v
:String(v)
chamadasv.toString()
'' + v
chamadasv.valueOf()
antes de qualquer outro tipo de conversãoPara que pudéssemos fazer algo como:
Testado no FF 34.0 e no nó 0.10
fonte
se você concorda com nulo, indefinido, NaN, 0 e falso, toda a conversão para ''
(s ? s+'' : '')
é mais rápida.consulte http://jsperf.com/cast-to-string/8
observação - há diferenças significativas entre os navegadores no momento.
fonte
Exemplo do mundo real: Eu tenho uma função de log que pode ser chamado com um número arbitrário de parâmetros:
log("foo is {} and bar is {}", param1, param2)
. Se umDEBUG
sinalizador estiver definido comotrue
, os colchetes serão substituídos pelos parâmetros fornecidos e a cadeia de caracteres será passada paraconsole.log(msg)
. Os parâmetros podem e serão Strings, Numbers e tudo o que pode ser retornado por chamadas JSON / AJAX, talvez aténull
.arguments[i].toString()
não é uma opção, devido aosnull
valores possíveis (consulte a resposta de Connell Watkins)arguments[i] + ""
. Isso pode ou não influenciar uma decisão sobre o que usar. Algumas pessoas aderem estritamente ao JSLint.fonte
Nesta página, você pode testar o desempenho de cada método você mesmo :)
http://jsperf.com/cast-to-string/2
aqui, em todas as máquinas e navegadores, ' "" + str ' é o mais rápido, (String) str é o mais lento
fonte