LINUX.ORG.RU

История изменений

Исправление 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.