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()
尝试下面的文章。