Подтвердить что ты не робот

Имеет ли javascript встроенный класс stringbuilder?

Я вижу несколько проектных решений для кода:

но хотел посмотреть, была ли регулярная реализация в javascript?

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

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

ИЗМЕНИТЬ. Я сделал эксперимент, чтобы сравнить скорость метода 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));

Я тестировал его в IE8 и FireFox 3.5.5, как на Windows 7 x64.

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

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

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

Максимальный счетчик итераций, который я мог бы протестировать в IE, не имея "script занимает слишком много времени для выполнения", составлял 850 000. Тогда IE был 1593 для конкатенации строк и 2046 для объединения массивов, Firefox имел 2101 для конкатенации строк и 2249 для объединения массива.

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

UPDATE
Я выполнил тест на IE6 (WindowsXP). Процесс прекратился, чтобы ответить немедленно и никогда не заканчивался, если я попробовал тест на более чем 100 000 итераций. На 40'000 итераций результаты были

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

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

Ответ 3

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

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

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

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

Ответ 4

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

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

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}

Ответ 5

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

 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);

Ответ 6

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

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

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

Ответ 7

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