Есть ли в JavaScript встроенный класс stringbuilder? - PullRequest
159 голосов
/ 18 января 2010

Я вижу несколько решений кода проекта .

Но есть ли регулярная реализация в JavaScript?

Ответы [ 10 ]

278 голосов
/ 18 января 2010

Если вам нужно написать код для Internet Explorer, убедитесь, что вы выбрали реализацию, которая использует соединения с массивами. Конкатенация строк с оператором + или += чрезвычайно медленна в IE. Это особенно верно для IE6. В современных браузерах += обычно так же быстро, как соединения массивов.

Когда мне приходится делать много конкатенаций строк, я обычно заполняю массив и не использую класс построителя строк:

var html = [];
html.push(
  "<html>",
  "<body>",
  "bla bla bla",
  "</body>",
  "</html>"
);
return html.join("");

Обратите внимание, что методы push принимают несколько аргументов.

42 голосов
/ 25 ноября 2014

Я только что перепроверил производительность на http://jsperf.com/javascript-concat-vs-join/2. Контрольные примеры объединяют или присоединяют алфавит 1000 раз.

В текущих браузерах (FF, Opera, IE11, Chrome) "concat" - этопримерно в 4-10 раз быстрее, чем "join".

В IE8 оба возвращают примерно одинаковые результаты.

В IE7 "join", к сожалению, примерно в 100 раз быстрее.

31 голосов
/ 18 января 2010

Нет, встроенная поддержка для построения строк отсутствует. Вместо этого вы должны использовать конкатенацию.

Конечно, вы можете создать массив из различных частей вашей строки и затем вызвать join() для этого массива, но это зависит от того, как реализовано объединение в используемом вами интерпретаторе JavaScript.

Я провел эксперимент, чтобы сравнить скорость метода str1+str2 с методом array.push(str1, str2).join(). Код был прост:

var iIterations =800000;
var d1 = (new Date()).valueOf();
str1 = "";
for (var i = 0; i<iIterations; i++)
    str1 = str1 + Math.random().toString();
var d2 = (new Date()).valueOf();
log("Time (strings): " + (d2-d1));

var d3 = (new Date()).valueOf();
arr1 = [];
for (var i = 0; i<iIterations; i++)
    arr1.push(Math.random().toString());
var str2 = arr1.join("");
var d4 = (new Date()).valueOf();
log("Time (arrays): " + (d4-d3));

Я тестировал его в Internet Explorer 8 и Firefox 3.5.5, оба на Windows 7 x64.

Вначале я тестировал на небольшом количестве итераций (несколько сотен, несколько тысяч единиц). Результаты оказались непредсказуемыми (иногда конкатенация строк занимала 0 миллисекунд, иногда - 16 миллисекунд, то же самое для объединения массивов).

Когда я увеличил счет до 50 000, результаты были разными в разных браузерах - в Internet Explorer конкатенация строк была быстрее (94 миллисекунды), а соединение было медленнее (125 миллисекунд), в то время как в Firefox соединение массивов было быстрее (113 миллисекунд), чем объединение строк (117 миллисекунд).

Затем я увеличил счет до 500'000. Теперь array.join() был медленнее, чем конкатенация строк в обоих браузерах: конкатенация строк составила 937 мс в Internet Explorer, 1155 мс в Firefox, объединение массивов 1265 в Internet Explorer и 1207 мс в Firefox.

Максимальное число итераций, которое я мог протестировать в Internet Explorer, не имея «сценария выполняется слишком долго», составляло 850 000. Тогда Internet Explorer был 1593 для конкатенации строк и 2046 для соединения массивов, а Firefox имел 2101 для конкатенации строк и 2249 для соединения массивов.

Результаты - если число итераций невелико, вы можете попробовать использовать array.join(), так как это может быть быстрее в Firefox. Когда число увеличивается, метод string1+string2 работает быстрее.

UPDATE

Я выполнил тест в Internet Explorer 6 (Windows XP). Процесс перестал отвечать немедленно и никогда не заканчивался, если я пробовал тестировать более 100 000 итераций. На 40000 итераций результаты были

Time (strings): 59175 ms
Time (arrays): 220 ms

Это означает, что если вам нужна поддержка Internet Explorer 6, выберите array.join(), что намного быстрее, чем конкатенация строк.

7 голосов
/ 02 февраля 2018

В версии ECMAScript 6 (также известной как ECMAScript 2015) JavaScript представлен строковые литералы .

var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;

Обратите внимание, что обратные галочки вместо одинарных кавычек заключают строку.

6 голосов
/ 18 января 2010

Этот код выглядит как маршрут, по которому вы хотите идти, с несколькими изменениями.

Вы захотите изменить метод добавления так, чтобы он выглядел следующим образом. Я изменил его, чтобы принять число 0 и вернуть this, чтобы вы могли связать свои добавления.

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}
3 голосов
/ 07 июня 2017

В C # вы можете сделать что-то вроде

 String.Format("hello {0}, your age is {1}.",  "John",  29) 

В JavaScript вы можете сделать что-то вроде

 var x = "hello {0}, your age is {1}";
 x = x.replace(/\{0\}/g, "John");
 x = x.replace(/\{1\}/g, 29);
1 голос
/ 06 июня 2018

Я определил эту функцию:

function format() {
        var args = arguments;
        if (args.length <= 1) { 
            return args;
        }
        var result = args[0];
        for (var i = 1; i < args.length; i++) {
            result = result.replace(new RegExp("\\{" + (i - 1) + "\\}", "g"), args[i]);
        }
        return result;
    }

И может называться как c #:

 var text = format("hello {0}, your age is {1}.",  "John",  29);

Результат:

привет Джон, тебе 29 лет.

1 голос
/ 01 апреля 2014

Для тех, кто заинтересован, вот альтернатива вызову Array.join:

var arrayOfStrings = ['foo', 'bar'];
var result = String.concat.apply(null, arrayOfStrings);
console.log(result);

Результатом, как и ожидалось, является строка 'foobar'.В Firefox этот подход превосходит Array.join, но опережает + конкатенация.Поскольку String.concat требует, чтобы каждый сегмент указывался в качестве отдельного аргумента, вызывающая сторона ограничена пределом количества аргументов, установленным исполняющим движком JavaScript.Посмотрите на документацию Function.prototype.apply () для получения дополнительной информации.

0 голосов
/ 29 мая 2017

Как насчет sys.StringBuilder() попробуйте следующую статью.

https://msdn.microsoft.com/en-us/library/bb310852.aspx

0 голосов
/ 12 января 2016

Когда я обнаружил, что в JavaScript много конкатенации строк, я начинаю искать шаблоны. Handlebars.js работает довольно хорошо, что делает HTML и JavaScript более читабельным. http://handlebarsjs.com

...