我看到了一些代码项目解决方案。
但是JavaScript中有常规的实现吗?
我看到了一些代码项目解决方案。
但是JavaScript中有常规的实现吗?
当前回答
不,没有内置的构建字符串的支持。您必须使用连接来代替。
当然,您可以将字符串的不同部分组成一个数组,然后在该数组上调用join(),但这取决于您所使用的JavaScript解释器中如何实现连接。
我做了一个实验,比较str1+str2方法和数组的速度。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毫秒)。
然后我把数量增加到50万。现在,array.join()在两个浏览器中都比字符串连接慢:Internet Explorer中的字符串连接为937毫秒,Firefox中的字符串连接为1155毫秒,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次迭代中尝试测试,这个过程就会立即停止响应,并且永远不会结束。 经过4万次迭代,结果是
Time (strings): 59175 ms
Time (arrays): 220 ms
这意味着-如果你需要支持Internet Explorer 6,选择array.join(),它比字符串连接快得多。
其他回答
不,没有内置的构建字符串的支持。您必须使用连接来代替。
当然,您可以将字符串的不同部分组成一个数组,然后在该数组上调用join(),但这取决于您所使用的JavaScript解释器中如何实现连接。
我做了一个实验,比较str1+str2方法和数组的速度。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毫秒)。
然后我把数量增加到50万。现在,array.join()在两个浏览器中都比字符串连接慢:Internet Explorer中的字符串连接为937毫秒,Firefox中的字符串连接为1155毫秒,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次迭代中尝试测试,这个过程就会立即停止响应,并且永远不会结束。 经过4万次迭代,结果是
Time (strings): 59175 ms
Time (arrays): 220 ms
这意味着-如果你需要支持Internet Explorer 6,选择array.join(),它比字符串连接快得多。
如果您必须为Internet Explorer编写代码,请确保您选择了使用数组连接的实现。用+或+=操作符连接字符串在IE上非常慢。对于IE6来说尤其如此。在现代浏览器中+=通常和数组连接一样快。
当我必须做很多字符串连接时,我通常填充一个数组,不使用字符串构建器类:
var html = [];
html.push(
"<html>",
"<body>",
"bla bla bla",
"</body>",
"</html>"
);
return html.join("");
注意,push方法接受多个参数。
下面是Typescript中StringBuilder类的一个快速示例:
export class StringBuilder {
private _lines: string[] = [];
write(line: string = ""): void {
this._lines.push(line);
}
writeln(line: string = ""): void {
this._lines.push(line);
this._lines.push("\n");
}
toString(): string {
return this._lines.join("");
}
}
你可以像下面这样使用:
const sb = new StringBuilder();
sb.write("Hello World");
sb.writeln("!");
console.log(sb.toString());
StringBuilder JavaScript尝试这个..
function StringBuilder(value) { this.strings = new Array(); this.append(value); } StringBuilder.prototype.append = function (value) { if (value) { this.strings.push(value); } } StringBuilder.prototype.clear = function () { this.strings.length = 0; } StringBuilder.prototype.toString = function () { return this.strings.join(""); } var sb = new StringBuilder(); sb.append("This is"); sb.append("much better looking"); sb.append("than using +="); var myString = sb.toString(); sb.clear();
我刚刚在http://jsperf.com/javascript-concat-vs-join/2上重新检查了性能。 测试用例连接或连接字母表1000次。
在当前的浏览器(FF, Opera, IE11, Chrome)中,“concat”比“join”快4-10倍。
在IE8中,两者返回的结果大致相同。
不幸的是,在IE7中,“join”要快100倍。