JavaScript有一个内置的stringbuilder类?

我看到几个代码项目解决scheme :

但想看看是否有一个正常的JavaScript实现?

如果您必须为Internet Explorer编写代码,请确保select了使用数组连接的实现。 使用++=运算符连接string在IE上非常慢。 对于IE6尤其如此。 在现代浏览器上+=通常和数组连接一样快。

当我必须做大量的string连接时,我通常会填充一个数组,而不要使用string构build器类:

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

请注意, push方法接受多个参数。

不,没有对构buildstring的内置支持,您必须使用连接。

当然,你可以创build一个你的string的不同部分的数组,然后在该数组上调用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)); 

我testing了它在IE8和FireFox 3.5.5,都在Windows 7 x64上。

在一开始,我testing了less量的迭代(几百个,几千个项目)。 结果是不可预知的(有时string连接需要0毫秒,有时需要16毫秒,对于数组连接相同)。

当我把计数增加到50'000时,结果在不同的浏览器中是不同的 – 在IE中,string连接速度更快(94毫秒),连接速度更慢(125毫秒),而在Firefox中,数组连接更快(113毫秒)比连接string(117毫秒)。

然后我把计数增加到50万。 现在在两个浏览器中, array.join() 比string连接慢。stringconcat在IE中为937ms,在Firefox中为1155ms,在IE中为1265,在Firefox中为1207。

我可以在IE中testing的最大迭代次数是“脚本执行时间太长”,达到了850'000。 然后IE是1593年string连接和2046年数组连接,Firefox有2101年string连接和2249年数组连接。

结果 – 如果迭代次数很less,可以尝试使用array.join() ,因为在Firefox中可能会更快。 当数字增加时, string1+string2方法更快。

UPDATE
我在IE6(WindowsXP)上进行了testing。 如果我尝试了超过100000次迭代的testing,那么这个过程就会立即停止并且不会结束。 在40,000次迭代中,结果是

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

这意味着 – 如果你需要支持IE6,selectarray.join()比string连接快得多。

我只是重新检查http://jsperf.com/javascript-concat-vs-join/2性能。; testing案例连接或join字母表1000次。

在目前的浏览器(FF,Opera,IE11,Chrome)中,“concat”比“join”快4-10倍。

在IE8中,两者返回的结果大致相同。

在IE7中,“join”不幸地快了100倍。

该代码看起来像你想要做的一些改变的路线。

你会想要改变append方法看起来像这样。 我已经改变它接受数字0,并让它返回this所以你可以连锁你的追加。

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

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

对于那些感兴趣的,这里是一个替代调用Array.join:

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

正如预期的那样,输出是string“foobar”。 在Firefox中,这种方法优于Array.join,但优于+串联。 由于String.concat要求每个段被指定为一个单独的参数,所以调用者受到执行JavaScript引擎施加的任何参数计数限制的限制。 请参阅Function.prototype.apply()的文档以获取更多信息。

当我发现自己在JavaScript中做了很多string连接时,我开始寻找模板。 Handlebars.js很好地保持了HTML和JavaScript的可读性。 http://handlebarsjs.com

如何sys.StringBuilder()尝试下面的文章。

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