Ils sont immuables. Vous ne pouvez pas modifier un caractère dans une chaîne avec quelque chose comme var myString = "abbdef"; myString[2] = 'c'
. Les méthodes de manipulation de chaînes de caractères telles que trim
, slice
renvoient de nouvelles chaînes.
De la même manière, si vous avez deux références à la même chaîne de caractères, la modification de l'une n'affecte pas l'autre
let a = b = "hello";
a = a + " world";
// b is not affected
Cependant, j'ai toujours entendu ce qu'Ash a mentionné dans sa réponse (que l'utilisation de Array.join est plus rapide pour la concaténation), j'ai donc voulu tester les différentes méthodes de concaténation de chaînes et abstraire la façon la plus rapide dans un StringBuilder. J'ai écrit quelques tests pour voir si c'était vrai (ça ne l'est pas !).
C'est ce que je pensais être la méthode la plus rapide, même si je n'arrêtais pas de penser que l'ajout d'un appel de méthode pourrait ralentir le processus...
function StringBuilder() {
this._array = [];
this._index = 0;
}
StringBuilder.prototype.append = function (str) {
this._array[this._index] = str;
this._index++;
}
StringBuilder.prototype.toString = function () {
return this._array.join('');
}
Voici des tests de vitesse de performance. Tous les trois créent une gigantesque chaîne de caractères composée de la concaténation de "Hello diggity dog"
cent mille fois dans une chaîne vide.
J'ai créé trois types de tests
- Utilisation
Array.push
y Array.join
- Utiliser l'indexation des tableaux pour éviter
Array.push
puis en utilisant Array.join
- Concaténation directe de chaînes de caractères
J'ai ensuite créé les trois mêmes tests en les abstrayant en StringBuilderConcat
, StringBuilderArrayPush
y StringBuilderArrayIndex
http://jsperf.com/string-concat-without-sringbuilder/5 Allez-y et faites des tests pour que nous puissions obtenir un bon échantillon. Notez que j'ai corrigé un petit bug, donc les données pour les tests ont été effacées, je mettrai à jour le tableau une fois qu'il y aura assez de données de performance. Aller à http://jsperf.com/string-concat-without-sringbuilder/5 pour l'ancien tableau de données.
Voici quelques chiffres (dernière mise à jour en mars 2018), si vous ne souhaitez pas suivre le lien. Le nombre sur chaque test est en 1000 opérations/seconde ( plus c'est haut, mieux c'est )
Navigateur
Index
Pousser
Concat
SBIndex
SBPush
SBConcat
Chrome 71.0.3578
988
1006
2902
963
1008
2902
Firefox 65
1979
1902
2197
1917
1873
1953
Bord
593
373
952
361
415
444
Exploder 11
655
532
761
537
567
387
Opera 58.0.3135
1135
1200
4357
1137
1188
4294
Résultats
-
Aujourd'hui, tous les navigateurs modernes gèrent bien la concaténation de chaînes de caractères. Array.join
ne fonctionne qu'avec IE 11
-
Dans l'ensemble, Opera est le plus rapide, 4 fois plus rapide que Array.join.
-
Firefox est deuxième et Array.join
est à peine plus lent dans FF mais considérablement plus lent (3x) dans Chrome.
-
Chrome est troisième mais string concat est 3 fois plus rapide que Array.join
-
La création d'un StringBuilder ne semble pas trop affecter les performances.
J'espère que quelqu'un d'autre trouvera cela utile
Cas de test différent
Puisque @RoyTinker pensait que mon test était défectueux, j'ai créé un nouveau cas qui ne crée pas une grosse chaîne en concaténant la même chaîne, mais qui utilise un caractère différent à chaque itération. La concaténation de chaînes de caractères semble toujours plus rapide ou tout aussi rapide. Lançons ces tests.
Je suggère que tout le monde continue à réfléchir à d'autres façons de tester cela, et n'hésitez pas à ajouter de nouveaux liens vers différents cas de test ci-dessous.
http://jsperf.com/string-concat-without-sringbuilder/7
4 votes
Oui, ils sont immuables et vous avez besoin d'un "string builder" de quelque sorte. Lisez ce blog.codeeffects.com/Article/String-Builder-In-Java-Script ou celui-ci codeproject.com/KB/scripting/stringbuilder.aspx
3 votes
Intéressant, ces exemples contredisent mes conclusions dans ma réponse.