Todo mundo fica dizendo que um dos problemas do JavaScript está usando +
[ exemplo ] para concatenação de strings. Alguns dizem que o problema não está sendo usado +
, é tipo coerção [veja os comentários do exemplo anterior]. Mas linguagens fortemente tipadas usam + para concatenação e coerção de tipos sem nenhum problema. Por exemplo, em C #:
int number = 1;
MyObject obj = new MyObject();
var result = "Hello" + number + obj;
// is equivalent to
string result = "hello" + number.ToString() + obj.ToString();
Então, por que a concatenação de strings no JavaScript é um problema tão grande?
javascript
configurador
fonte
fonte
bad
. Quem éEveryone
?Respostas:
Considere esta parte do código JavaScript:
Isso registrará
O que provavelmente não é o que foi planejado e pode ser um bug difícil de rastrear.
fonte
a
eb
emstr(a)
estr(b)
chamadas; caso contrário, você recebe umValueError: cannot concatenate 'str' and 'int'
.'result is ' + (a + b)
.System.Console.WriteLine("result is " + 10 + 20);
, mas nunca ninguém se queixa disso em C #. É isso que eu não entendo - o que é o JavaScript que o torna mais confuso?Quando você diz "ruim", significa "incorreto" ou "lento"? O argumento sobre o uso de operadores matemáticos para concatenação de strings é sem dúvida um argumento "incorreto", mas também há um argumento a ser feito que o uso
+
para fazer muita concatenação de strings pode ser muito lento.Não estamos falando sobre
"Hello" + number
quando falamos sobre desempenho, mas sobre como construir uma cadeia relativamente grande anexando-a repetidamente em um loop.Em JavaScript (e C #), as strings são imutáveis. Eles nunca podem ser alterados, apenas substituídos por outras strings. Você provavelmente está ciente de que
combined + "hello "
não modifica diretamente acombined
variável - a operação cria uma nova sequência resultante da concatenação das duas seqüências juntas, mas você deve atribuir essa nova sequência àcombined
variável, se desejar que ela seja alterada.Então, o que esse loop está fazendo é criar um milhão de objetos de string diferentes e jogar fora 999.999 deles. Criar muitas seqüências de caracteres que crescem continuamente em tamanho não é rápido, e agora o coletor de lixo tem muito trabalho a fazer para limpar depois disso.
O C # tem exatamente o mesmo problema, resolvido nesse ambiente pela classe StringBuilder . Em JavaScript, você obtém um desempenho muito melhor criando uma matriz de todas as sequências que deseja concatenar e juntando-as uma vez no final, em vez de um milhão de vezes no ciclo:
fonte
Não é ruim usar + para adição e concatenação, desde que você possa adicionar apenas números e concatenar seqüências de caracteres. No entanto, o Javascript converterá automaticamente entre números e seqüências de caracteres conforme necessário, para que você tenha:
Talvez, mais simplesmente, sobrecarregar "+" na presença de conversão automática de tipo interrompa a associatividade esperada do operador +:
fonte
3 + 5 == 5 + 3
mas"3" + "5" != "5" + "3"
O problema típico levantado para a concatenação de cadeias de caracteres gira em torno de alguns problemas:
+
símbolo está sendo sobrecarregado# 1
O primeiro e mais importante problema com o uso
+
para concatenação e adição de strings é que você está usando+
para concatenação e adição de strings .se você tiver variáveis
a
eb
, e definirc = a + b
, há uma ambiguidade dependente dos tipos dea
eb
. Essa ambiguidade força você a tomar medidas extras para atenuar o problema:Concat de String:
Adição:
Isso me leva ao meu segundo ponto
# 2
É muito fácil converter acidentalmente uma variável em uma string sem perceber. Também é fácil esquecer que sua entrada está chegando como uma string:
Produzirá resultados não intuitivos porque prompt retorna o valor da string da entrada.
# 3
Precisando digitar
parseFloat
ouNumber()
toda vez que eu quero fazer adição é tedioso e irritante. Eu me considero inteligente o suficiente para lembrar de não estragar meus tipos dinâmicos, mas isso não significa que nunca estraguei meus tipos dinâmicos . A verdade é que tenho preguiça de digitarparseFloat
ouNumber()
toda vez que faço acréscimo, porque faço muito acréscimo.Solução?
Nem todos os idiomas usam
+
para concatenação de cadeias. O PHP usa.
para concatenar cadeias de caracteres, o que ajuda a distinguir entre quando você deseja adicionar números e quando deseja associar cadeias.Qualquer símbolo pode ser usado para concatenar seqüências de caracteres, mas a maioria já está sendo usada, e é melhor evitar a duplicação. Se eu tivesse o que queria, provavelmente usaria
_
para juntar seqüências de caracteres e proibir os_
nomes de variáveis.fonte