Tout le monde répète que l'un des problèmes de JavaScript est l'utilisation de +
[ exemple ] pour la concaténation de chaînes. Certains disent que le problème ne consiste pas à utiliser +
, c'est une contrainte de type [voir les commentaires de l'exemple précédent]. Mais les langages fortement typés utilisent + pour concaténer et contraindre les types sans aucun problème. Par exemple, en C #:
int number = 1;
MyObject obj = new MyObject();
var result = "Hello" + number + obj;
// is equivalent to
string result = "hello" + number.ToString() + obj.ToString();
Alors, pourquoi la concaténation de chaînes en JavaScript est-elle un si gros problème?
javascript
configurateur
la source
la source
bad
. Qui estEveryone
?Réponses:
Considérons ce morceau de code JavaScript:
Cela va se connecter
Le plus probable n'est pas ce qui était prévu et peut être un bug difficile à détecter.
la source
a
etb
dansstr(a)
etstr(b)
appels; sinon, vous obtenez unValueError: cannot concatenate 'str' and 'int'
.'result is ' + (a + b)
.System.Console.WriteLine("result is " + 10 + 20);
, mais personne ne se plaint de cela en C #. C'est ce que je ne comprends pas. Qu'est-ce qui rend le code JavaScript plus déroutant?Lorsque vous dites "mauvais", vous voulez dire "incorrect" ou voulez-vous dire "lent"? L'argument concernant l'utilisation d'opérateurs mathématiques pour effectuer la concaténation de chaînes est sans doute un argument "incorrect", mais il existe également un argument selon lequel l'utilisation
+
de nombreuses concaténations de chaînes peut être très lente.Nous ne parlons pas
"Hello" + number
de performance, nous parlons de créer une chaîne relativement grande en l'ajoutant de manière répétée dans une boucle.En JavaScript (et C # d'ailleurs), les chaînes sont immuables. Ils ne peuvent jamais être changés, seulement remplacés par d'autres chaînes. Vous savez probablement que
combined + "hello "
cela ne modifie pas directement lacombined
variable - l'opération crée une nouvelle chaîne résultant de la concaténation des deux chaînes, mais vous devez ensuite affecter cette nouvelle chaîne à lacombined
variable si vous souhaitez qu'elle soit modifiée.Cette boucle crée donc un million d'objets chaîne différents et en élimine 999 999. Il n'est pas rapide de créer autant de chaînes qui grossissent continuellement, et le ramasse-miettes a maintenant beaucoup de travail à faire pour nettoyer par la suite.
C # a exactement le même problème, qui est résolu dans cet environnement par la classe StringBuilder . En JavaScript, vous obtiendrez de bien meilleures performances en construisant un tableau de toutes les chaînes que vous souhaitez concaténer, puis en les réunissant une fois à la fin, au lieu d'un million de fois dans la boucle:
la source
Ce n'est pas mal d'utiliser + pour les ajouts et les concaténations, tant que vous ne pouvez ajouter que des nombres et concaténer des chaînes. Cependant, Javascript convertira automatiquement entre les nombres et les chaînes selon vos besoins. Vous aurez donc:
Peut-être plus simplement, surcharger "+" en présence de conversion de type automatique annule l'associativité attendue de l'opérateur +:
la source
3 + 5 == 5 + 3
mais"3" + "5" != "5" + "3"
Le problème typique évoqué pour la concaténation de chaînes tourne autour de quelques problèmes:
+
symbole étant surchargé#1
Le premier et principal problème de l'utilisation
+
de la concaténation et de l' ajout de chaînes est l'utilisation que vous utilisez+
pour la concaténation et l' ajout de chaînes .si vous avez des variables
a
etb
, et vous définissezc = a + b
, une ambiguïté dépend des types dea
etb
. Cette ambiguïté vous oblige à prendre des mesures supplémentaires pour atténuer le problème:Corde Concat:
Une addition:
Cela m'amène à mon deuxième point
# 2
Il est très facile de convertir accidentellement une variable en chaîne sans s'en rendre compte. Il est également facile d'oublier que votre entrée arrive sous forme de chaîne:
Produira des résultats non intuitifs car prompt renvoie la valeur de chaîne de l'entrée.
# 3
Il est fastidieux et ennuyeux de devoir taper
parseFloat
ouNumber()
chaque fois que je veux faire des ajouts. Je me considère assez intelligent pour ne pas gâcher mes types dynamiques, mais cela ne veut pas dire que je n'ai jamais foiré mes types dynamiques . La vérité, c’est que je suis trop paresseux pour taperparseFloat
ouNumber()
chaque fois que je fais des ajouts, parce que je fais beaucoup d’ajouts.Solution?
Toutes les langues ne sont pas utilisées
+
pour la concaténation de chaînes. PHP utilise.
pour concaténer des chaînes, ce qui permet de distinguer entre le moment où vous souhaitez ajouter des nombres et le moment où vous souhaitez joindre des chaînes.N'importe quel symbole peut être utilisé pour concaténer des chaînes, mais la plupart sont déjà utilisées et il est préférable d'éviter les doublons. Si je le pouvais, j'aurais probablement l'habitude
_
de joindre des chaînes et de ne pas autoriser les_
noms de variables dans.la source