Вопрос по javascript, stringbuilder – Есть ли в JavaScript встроенный класс stringbuilder?

148

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

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

Нет, нетт. kennytm

Ваш Ответ

10   ответов
1

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

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 лет.

Мне нравится это ... выглядит как C # Ayo Adesina
30

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

Вы можете, конечно, создать массив различных частей вашей строки, а затем вызвать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));="" d3="(new" arr1="[];" for="" (var="" i="0;" i<iiterations;="" arr1.push(math.random().tostring());="" str2="arr1.join("");" d4="(new" (arrays):="" (d4-d3));="" <="" code=""></iiterations;>

Я проверил это в интернетеисследователь8 и Firefox 3.5.5, оба на Windows 7 x64.

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

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

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

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

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

ОБНОВИТЬ

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

<code>Time (strings): 59175 ms
Time (arrays): 220 ms
</code>

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

спасибо за отличный совет :) RameshVel
IE6, как всегда, является исключением :) Gordon Tucker
Люди с IE6 привыкли все делать очень медленно. Я нене думаю, что онибуду винить тебя. Lodewijk
Да, это было то, что я имел в виду. Извините за мой английский ;-) Я добавил результаты сравнения того, как быстро какой метод работает в двух браузерах. Вы можете видеть, это отличается. naivists
6

ECMAScript6 версия (он же ECMAScript2015) JavaScript введенстроковые литералы.

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

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

Как это отвечает на вопрос? Peter Mortensen
@ Питер Мортенсен, этот ответ просто дает другой способ построить строку. Оригинальный постер не сделалне указывать, какой тип функциональности компоновщика строк ищется. Theophilus
40

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

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

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

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

@ Андреас: Я полагаю, что ваш тест находится на пути к коду в Chrome, гденикогда не выполняет фактическую конкатенацию, потому что строка никогда не читается. Тем не менее, даже при форсировании скорость выполнения все равно значительно выше:jsperf.com/yet-another-string-concat-test/1 Joseph Lennox
Спасибо за это. Это должно быть увеличено в списке ответов. Это'на IE10 также намного быстрее (я знаю, чтоЭто не современный браузер, но я упоминаю об этом для любых потенциальных разработчиков NMCI, видящих это). James Wilson
0

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

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

6

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

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

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}
Почему принимаются только не NaN числа и непустые строки? Ваш метод выигралне принимаю,nullfalseпустые строки,undefined, или же .NaN Eli Grey
+1 для цепочки. slebetman
@Elijah - я предпочитаю содержать мой класс StringBuilder в чистоте, не принимая ничего, кроме допустимых строк и чисел. Это просто личное предпочтение. Gordon Tucker
1

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

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

Это не удается в Chrome, так какString.Concat» не определено Вместо этого вы можете использовать.concat.apply ( '', arrayOfStrings). Но это все еще очень медленный метод. Andreas
3

В 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);
@ikegami строка не переменная, это константа, так что вы знаете, что в ней содержится априори. sports
Я очень сомневаюсь, что выполнение регулярного выражения вместо объединения строк будет более производительным tic
@sports, Копирование и вставка всего этого в ваш код - еще худшая идея. ikegami
Один вкладыш с $ 1 и $ 2, заменяющими группы без захвата: x..replace (/ ([\ s \ S] *?) \ {0 \} ([\ s \ S] *?) \ {1 \} / г, "$ 1Tom $ 225" ) T.CK
Кроме того, это ужасная реализация. Это сломается, если строка с которой{0} заменено содержит.{1} ikegami
268

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

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

var html = [];
html.push(
  "",
  "",
  "bla bla bla",
  "",
  ""
);
return html.join("");

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

Я считаю, что это намного более читабельно, чем строка + строка + строка Andrew Ehrlich
@DaveWard, ваша ссылка не работает :( Ivan Kochurkin
И если вы'генерировать выходные данные, или все члены являются литералами,[foo(), "bar", "baz"].join(""); тоже работает Anonymous
Я не'не знаюpush мог принять несколько аргументов. Случайные вещи, которые вы изучаете. Carcigenicate
0

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

Похожие вопросы