我看到了几个代码项目解决方案。
但是在 JavaScript 中有一个常规的实现吗?
我看到了几个代码项目解决方案。
但是在 JavaScript 中有一个常规的实现吗?
如果您必须为 Internet Explorer 编写代码,请确保您选择了一个使用数组连接的实现。在 IE 上使用+
or+=
运算符连接字符串非常慢。对于 IE6 尤其如此。在现代浏览器+=
上,通常与数组连接一样快。
当我必须进行大量字符串连接时,我通常会填充一个数组并且不使用字符串构建器类:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
请注意,这些push
方法接受多个参数。
我刚刚重新检查了http://jsperf.com/javascript-concat-vs-join/2上的性能。测试用例连接或加入字母表 1,000 次。
在当前的浏览器(FF、Opera、IE11、Chrome)中,“concat”大约比“join”快 4-10 倍。
在 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));
我在 Windows 7 x64 上的 Internet Explorer 8 和 Firefox 3.5.5 中对其进行了测试。
一开始我测试了少量的迭代(大约数百个,数千个项目)。结果是不可预测的(有时字符串连接需要 0 毫秒,有时需要 16 毫秒,数组连接也是如此)。
当我将计数增加到 50,000 时,结果在不同的浏览器中是不同的——在 Internet Explorer 中,字符串连接速度更快(94 毫秒),连接速度更慢(125 毫秒),而在 Firefox 中,数组连接速度(113 毫秒)比字符串连接(117 毫秒)。
然后我将计数增加到 500'000。现在array.join()
是慢于字符串连接两个浏览器:字符串连接是在Internet Explorer 937毫秒,1155毫秒在Firefox中,阵列在Internet Explorer中加入1265,并且在Firefox 1207毫秒。
在没有“脚本执行时间过长”的情况下,我可以在 Internet Explorer 中测试的最大迭代计数是 850,000。然后 Internet Explorer 的字符串连接为 1593,数组连接为 2046,Firefox 的字符串连接为 2101,数组连接为 2249。
结果- 如果迭代次数较少,您可以尝试使用array.join()
,因为它在 Firefox 中可能会更快。当数量增加时,该string1+string2
方法更快。
我在 Internet Explorer 6 (Windows XP) 上执行了测试。如果我在超过 100,000 次迭代中尝试测试,该过程立即停止响应并且永远不会结束。在 40,000 次迭代中,结果是
Time (strings): 59175 ms
Time (arrays): 220 ms
这意味着 - 如果您需要支持 Internet Explorer 6,请选择array.join()
比字符串连接更快的方式。
该代码看起来像您要经过一些更改的路线。
您需要将 append 方法更改为如下所示。我已将其更改为接受数字 0,并使其返回,this
以便您可以链接您的附加内容。
StringBuilder.prototype.append = function (value) {
if (value || value === 0) {
this.strings.push(value);
}
return this;
}
编辑
不,没有内置类。但是,这string literals
可能是一个合适的解决方法。
原答案
JavaScript 的 ECMAScript 6 版本(又名 ECMAScript 2015)引入了字符串文字。
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
请注意,反引号而不是单引号将字符串括起来。