Они неизменны. Вы не можете изменить символ в строке с чем-то вроде var myString = "abbdef"; myString[2] = 'c'
. Методы обработки строк, такие как trim
, slice
, возвращают новые строки.
Таким же образом, если у вас есть две ссылки на одну и ту же строку, изменение одной не влияет на другую
let a = b = "hello";
a = a + " world";
// b is not affected
Однако я всегда слышал, что Эш упомянул в своем ответе (что использование Array.join быстрее для конкатенации), поэтому я хотел проверить различные методы конкатенации строк и абстрагирования самого быстрого пути в StringBuilder. Я написал несколько тестов, чтобы проверить, правда ли это (это не так!).
Я полагал, что это будет самый быстрый способ, хотя я продолжал думать, что добавление вызова метода может замедлить его ...
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('');
}
Вот тесты скорости работы. Все три из них создают гигантскую строку, состоящую из конкатенации "Hello diggity dog"
сто тысяч раз в пустую строку.
Я создал три типа тестов
- Использование
Array.push
и Array.join
- Использование индексации массива, чтобы избежать
Array.push
, затем использование Array.join
- Прямая конкатенация строк
Затем я создал те же три теста, абстрагировав их в StringBuilderConcat
, StringBuilderArrayPush
и StringBuilderArrayIndex
http://jsperf.com/string-concat-without-sringbuilder/5 Пожалуйста, перейдите туда и запустите тесты, чтобы мы могли получить хороший образец. Обратите внимание, что я исправил небольшую ошибку, поэтому данные для тестов были стерты, я обновлю таблицу, как только будет достаточно данных о производительности. Перейдите к http://jsperf.com/string-concat-without-sringbuilder/5 для старой таблицы данных.
Вот некоторые цифры (последнее обновление в Ma5rch 2018), если вы не хотите переходить по ссылке. Число в каждом тесте составляет 1000 операций в секунду ( чем выше, тем лучше )
| Browser | Index | Push | Concat | SBIndex | SBPush | SBConcat |
---------------------------------------------------------------------------
| Chrome 71.0.3578 | 988 | 1006 | 2902 | 963 | 1008 | 2902 |
| Firefox 65 | 1979 | 1902 | 2197 | 1917 | 1873 | 1953 |
| Edge | 593 | 373 | 952 | 361 | 415 | 444 |
| Exploder 11 | 655 | 532 | 761 | 537 | 567 | 387 |
| Opera 58.0.3135 | 1135 | 1200 | 4357 | 1137 | 1188 | 4294 |
Результаты
В настоящее время все вечнозеленые браузеры хорошо обрабатывают конкатенацию строк. Array.join
помогает только IE 11
В целом, Opera работает быстрее, в 4 раза быстрее, чем Array.join
Firefox занимает второе место, а Array.join
лишь немного медленнее в FF, но значительно медленнее (в 3 раза) в Chrome.
Chrome - третий, но конкат строки в 3 раза быстрее Array.join
Создание StringBuilder, похоже, не сильно влияет на производительность.
Надеюсь, кто-то еще найдет это полезным
Другой тестовый набор
Поскольку @RoyTinker считал, что мой тест некорректен, я создал новый случай, в котором не создается большая строка путем объединения одной и той же строки, для каждой итерации он использует разные символы. Конкатенация строк все еще казалась более быстрой или такой же быстрой. Давайте запустим эти тесты.
Я предлагаю всем подумать о других способах проверки этого, и не стесняйтесь добавлять новые ссылки в различные тестовые примеры ниже.
http://jsperf.com/string-concat-without-sringbuilder/7