Есть ли в JavaScript встроенный класс stringbuilder?

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

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

 kennytm18 янв. 2010 г., 17:32
Нет, нетт.
 Kizz24 янв. 2013 г., 22:25

Ответы на вопрос(10)

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

Вы можете, конечно, создать массив различных частей вашей строки, а затем вызвать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. Теперь<code>array.join()</code> было<strong>медленнее, чем конкатенация строк</strong> в обоих браузерах: конкатенация строк в Интернете составила 937 мсExplorer, 1155 мс в Firefox, объединение массивов 1265 в интернетеПроводник и 1207 мс в Firefox.

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

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

ОБНОВИТЬ

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

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

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

 Eli Grey18 янв. 2010 г., 17:45
join() является частью ECMAScript, и каждый его интерпретатор JavaScript его реализует. С чего бы этозависит "?
 RameshVel20 янв. 2010 г., 11:05
спасибо за отличный совет :)
 Lodewijk09 янв. 2012 г., 02:24
Люди с IE6 привыкли все делать очень медленно. Я нене думаю, что онибуду винить тебя.
 John18 янв. 2010 г., 17:49
он имел в виду, КАК это было реализовано ... если этоРеализовано таким образом, что в цикле строка постоянно добавляется, а не создается сразу, тогда использование соединения будет бессмысленным
 Gordon Tucker19 янв. 2010 г., 22:03
IE6, как всегда, является исключением :)
 naivists19 янв. 2010 г., 08:33
Да, это было то, что я имел в виду. Извините за мой английский ;-) Я добавил результаты сравнения того, как быстро какой метод работает в двух браузерах. Вы можете видеть, это отличается.

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

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

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

 Theophilus15 февр. 2018 г., 02:46
@ Питер Мортенсен, этот ответ просто дает другой способ построить строку. Оригинальный постер не сделалне указывать, какой тип функциональности компоновщика строк ищется.
 Peter Mortensen14 февр. 2018 г., 20:04
Как это отвечает на вопрос?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 Ayo Adesina13 июн. 2018 г., 11:26
Мне нравится это ... выглядит как C #

В 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);
 sports24 сент. 2018 г., 17:41
@ikegami строка не переменная, это константа, так что вы знаете, что в ней содержится априори.
 ikegami23 сент. 2018 г., 20:40
Кроме того, это ужасная реализация. Это сломается, если строка с которой{0} заменено содержит.{1}
 T.CK11 мар. 2019 г., 14:07
Один вкладыш с $ 1 и $ 2, заменяющими группы без захвата: x..replace (/ ([\ s \ S] *?) \ {0 \} ([\ s \ S] *?) \ {1 \} / г, "$ 1Tom $ 225" )
 ikegami24 сент. 2018 г., 18:30
@sports, Копирование и вставка всего этого в ваш код - еще худшая идея.
 tic27 июл. 2018 г., 23:09
Я очень сомневаюсь, что выполнение регулярного выражения вместо объединения строк будет более производительным
Решение Вопроса

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

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

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

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

 Anonymous19 янв. 2010 г., 08:26
И если вы'генерировать выходные данные, или все члены являются литералами,[foo(), "bar", "baz"].join(""); тоже работает
 Andrew Ehrlich03 мар. 2014 г., 19:57
Я считаю, что это намного более читабельно, чем строка + строка + строка
 Ivan Kochurkin28 февр. 2013 г., 13:05
@DaveWard, ваша ссылка не работает :(
 Carcigenicate16 мар. 2016 г., 23:33
Я не'не знаюpush мог принять несколько аргументов. Случайные вещи, которые вы изучаете.
 Sam Hanes07 февр. 2019 г., 22:43
Обратите внимание, что IE здесь означает IE 7 и более ранние. В IE 8+ конкатенация не существуетне хуже, чем в других браузерах.
 slebetman18 янв. 2010 г., 17:53
+1 за идиому в пользу предметов.
 Cornelius16 нояб. 2012 г., 14:58
Хотя, вероятно, нельзя ожидать, что ссылки Dropbox будут работать в течение почти 3 лет, яБуду любопытно по поводу сравнения - и если оно все еще остается в силе.

Ваш ответ на вопрос