История изменений
Исправление ChALkeR, (текущая версия) :
Потому что строки в жс immutable и хранятся в пуле.
a + b реально не конкатенирует строки, а создаёт конструкцию вида `[&a, &b]` и кладёт её в пул.
Если ты будешь делать `var a = "; for (...) a += 'x';` посимвольно и долго, ты получишь в пуле стопицот версий всего этого добра и это выжрет всю память со скоростью самолёта.
Это касается не только жс, а всех языков, где строки реализованы похожим образом.
Чтобы не выжирать память длинными посимвольными строками, строки надо собирать стрингбилдерами, в жс для этого можно использовать массив: var a = []; for (...) a.push('x'); ... a.join("); — создаст тебе простую строку. Для остальных языков гугли string builder.
Но для малого количества конкатенаций длинных строк (что в целом типичный юзкейс для жс) такая организация их хранения даёт заметный выигрыш.
Исправление ChALkeR, :
Потому что строки в жс immutable и хранятся в пуле.
a + b реально не конкатенирует строки, а создаёт конструкцию вида `[&a, &b]` и кладёт её в пул.
Если ты будешь делать `var a = "; for (...) a += 'x';` посимвольно и долго, ты получишь в пуле стопицот версий всего этого добра и это выжрет всю память со скоростью самолёта.
Это касается не только жс, а всех языков, где строки реализованы похожим образом.
Чтобы не выжирать память, строки надо собирать стрингбилдерами, в жс для этого можно использовать массив: var a = []; for (...) a.push('x'); ... a.join("); — создаст тебе простую строку. Для остальных языков гугли string builder.
Исправление ChALkeR, :
Потому что строки в жс immutable и хранятся в пуле.
a + b реально не конкатенирует строки, а создаёт конструкцию вида `[&a, &b]` и кладёт её в пул (и поэтому, кстати, твой микробенчмарк говно).
Если ты будешь делать `var a = "; for (...) a += 'x';`, ты получишь в пуле стопицот версий всего этого добра и это выжрет всю память со скоростью самолёта.
Это касается не только жс, а всех языков, где строки реализованы похожим образом.
Чтобы не выжирать память, строки надо собирать стрингбилдерами, в жс для этого можно использовать массив: var a = []; for (...) a.push('x'); ... a.join("); — создаст тебе простую строку. Для остальных языков гугли string builder.
Исходная версия ChALkeR, :
Потому что строки в жс immutable и хранятся в пуле.
a + b реально не конкатенирует строки, а создаёт конструкцию вида `[&a, &b]` и кладёт её в пул.
Если ты будешь делать `var a = "; for (...) a += 'x';`, ты получишь в пуле стопицот версий всего этого добра и это выжрет всю память со скоростью самолёта.
Это касается не только жс, а всех языков, где строки реализованы похожим образом.
Чтобы не выжирать память, строки надо собирать стрингбилдерами, в жс для этого можно использовать массив: var a = []; for (...) a.push('x'); ... a.join("); — создаст тебе простую строку. Для остальных языков гугли string builder.