Я вижу несколько проектных решений для кода:
но хотел посмотреть, была ли регулярная реализация в javascript?
Я вижу несколько проектных решений для кода:
но хотел посмотреть, была ли регулярная реализация в javascript?
Если вам нужно написать код для Internet Explorer, убедитесь, что вы выбрали реализацию, в которой используются объединения массивов. Конкатенации строк с помощью оператора +
или +=
очень медленны в IE. Это особенно верно для IE6. В современных браузерах +=
обычно выполняется так же быстро, как объединение массивов.
Когда мне приходится делать много конкатенаций строк, я обычно заполняю массив и не использую класс построителя строк:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
Обратите внимание, что методы push
принимают несколько аргументов.
Нет, нет встроенной поддержки для построения строк, вместо этого вам нужно использовать конкатенацию.
Вы можете, конечно, создать массив разных частей вашей строки, а затем вызвать 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()
, который быстрее, чем конкатенация строк.
Я только что проверил производительность на http://jsperf.com/javascript-concat-vs-join/2. Тестовые примеры объединяются или присоединяются к алфавиту в 1000 раз.
В текущих браузерах (FF, Opera, IE11, Chrome) "concat" примерно в 4-10 раз быстрее, чем "join".
В IE8 оба возвращаются примерно равными результатами.
В IE7 "join" примерно в 100 раз быстрее.
Этот код похож на маршрут, который вы хотите сделать с несколькими изменениями.
Вы хотите изменить метод добавления, чтобы выглядеть так. Я изменил его, чтобы принять число 0 и вернуть его this
, чтобы вы могли привязать свои добавления.
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
В С# вы можете сделать что-то вроде
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);
Для желающих, здесь альтернатива вызову 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().
Когда я нахожу, что делаю много конкатенации строк в JavaScript, я начинаю искать шаблоны. Handlebars.js работает достаточно хорошо, сохраняя HTML и JavaScript более читаемыми. http://handlebarsjs.com
Как насчет sys.StringBuilder()
попробуйте следующую статью.