Я вижу несколько решений кода проекта .
Но есть ли регулярная реализация в JavaScript?
Я вижу несколько решений кода проекта .
Но есть ли регулярная реализация в JavaScript?
Ответы:
Если вам нужно написать код для Internet Explorer, убедитесь, что вы выбрали реализацию, которая использует соединения с массивами. Конкатенация строк с оператором +
или +=
является чрезвычайно медленной в IE. Это особенно верно для IE6. В современных браузерах+=
это обычно так же быстро, как присоединение массивов.
Когда мне приходится делать много конкатенаций строк, я обычно заполняю массив и не использую класс построителя строк:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
Обратите внимание, что push
методы принимают несколько аргументов.
[foo(), "bar", "baz"].join("");
, тоже работает.
push
мог принять несколько аргументов. Случайные вещи, которые вы изучаете.
Я только что проверил производительность на http://jsperf.com/javascript-concat-vs-join/2 . Контрольные примеры объединяют или присоединяют алфавит 1000 раз.
В современных браузерах (FF, Opera, IE11, Chrome) «concat» примерно в 4-10 раз быстрее, чем «join».
В IE8 оба возвращают примерно одинаковые результаты.
В IE7 «соединение», к сожалению, примерно в 100 раз быстрее.
Нет, встроенной поддержки для построения строк нет. Вместо этого вы должны использовать конкатенацию.
Конечно, вы можете создать массив различных частей вашей строки и затем вызвать 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
метод быстрее.
Я выполнил тест в Internet Explorer 6 (Windows XP). Процесс перестал отвечать немедленно и никогда не заканчивался, если я пробовал тестировать более 100 000 итераций. На 40000 итераций результаты были
Time (strings): 59175 ms
Time (arrays): 220 ms
Это означает, что если вам нужна поддержка Internet Explorer 6, выберите array.join()
способ, который быстрее, чем конкатенация строк.
join()
является частью ECMAScript, и каждый его интерпретатор JavaScript реализует его. Почему это "зависит"?
Этот код выглядит как маршрут, по которому вы хотите пойти, с несколькими изменениями.
Вы захотите изменить метод добавления так, чтобы он выглядел следующим образом. Я изменил его, чтобы принять число 0 и вернуть его, this
чтобы вы могли связать свои добавления.
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
null
, false
пустые строки, undefined
или NaN
.
Версия JavaScript ECMAScript 6 (также известная как ECMAScript 2015) представила строковые литералы .
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
Обратите внимание, что обратные тики вместо одинарных кавычек заключают строку.
В 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);
{0}
заменяется, содержит {1}
.
Для тех, кто заинтересован, вот альтернатива вызову 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 () для получения дополнительной информации.
Я определил эту функцию:
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 лет.
Когда я обнаружил, что в JavaScript много конкатенации строк, я начинаю искать шаблоны. Handlebars.js работает довольно хорошо, сохраняя HTML и JavaScript более читабельным. http://handlebarsjs.com
Как насчет sys.StringBuilder()
попробовать следующую статью.