JavaScript有内置的stringbuilder类吗?

我看到一些代码项目解决方案

但是JavaScript中有常规的实现吗?

220601 次浏览

不,没有内置的构建字符串的支持。您必须使用连接来代替。

当然,你可以用字符串的不同部分创建一个数组,然后在这个数组上调用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毫秒)。

然后我把数量增加到50万。现在,array.join()在两个浏览器中都是比字符串连接慢:字符串连接在Internet Explorer中是937毫秒,在Firefox中是1155毫秒,数组连接在Internet Explorer中是1265毫秒,在Firefox中是1207毫秒。

在没有“脚本执行时间太长”的情况下,我可以在ie中测试的最大迭代次数;是850000年。然后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(),这比字符串连接快得多。

如果您必须为Internet Explorer编写代码,请确保您选择了使用数组连接的实现。用++=操作符连接字符串在IE上非常慢。对于IE6来说尤其如此。在现代浏览器中,+=通常和数组连接一样快。

当我必须做很多字符串连接时,我通常填充一个数组,不使用字符串构建器类:

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

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

这段代码看起来就像您想要的路线,只是做了一些更改。

您将希望将append方法更改为如下所示。我已将其更改为接受数字0,并使其返回this,以便您可以链接您的追加。

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

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

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

正如预期的那样,输出是字符串'foobar'。在Firefox中,这种方法优于Array。连接,但性能优于+连接。因为字符串。concat要求将每个段指定为单独的参数,调用者会受到执行JavaScript引擎施加的参数计数限制。更多信息请看Function.prototype.apply()

我刚刚重新检查了http://jsperf.com/javascript-concat-vs-join/2上的性能。 测试用例连接或连接字母表1000次

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

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

不幸的是,在IE7中,“join”要快100倍。

当我发现自己在JavaScript中做了很多字符串连接时,我开始寻找模板。js工作得很好,使HTML和JavaScript更具可读性。http://handlebarsjs.com

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

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

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

编辑

不,没有内置类。然而,string literals可能是一个合适的变通方法。

原来的答案

JavaScript的ECMAScript 6版本(又名ECMAScript 2015)引入了字符串字面值

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

注意,将字符串括起来的是反勾号,而不是单引号。

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

下面是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());