JavaScript 有内置的 stringbuilder 类吗?

IT技术 javascript stringbuilder
2021-03-14 13:23:08

我看到了几个代码项目解决方案

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

6个回答

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

当我必须进行大量字符串连接时,我通常会填充一个数组并且不使用字符串构建器类:

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

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

我发现这比字符串 + 字符串 + 字符串更具可读性
2021-04-21 13:23:08
虽然人们可能无法指望 Dropbox 链接能持续工作近 3 年,但我对这种比较感到好奇——以及它是否仍然有效。
2021-04-24 13:23:08
如果您正在生成内联输出,或者所有成员都是文字[foo(), "bar", "baz"].join("");,也可以使用。
2021-05-03 13:23:08
我不知道push可以接受多个参数。你学到的随机的东西。
2021-05-03 13:23:08
@DaveWard,你的链接坏了:(
2021-05-14 13:23:08

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

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

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

不幸的是,在 IE7 中,“加入”大约快 100 倍。

谢谢你。这应该在答案列表中增加。它在 IE10 上也快得多(我知道这不是现代浏览器,但我向任何潜在的 NMCI 开发人员提到了这一点)。
2021-05-18 13:23:08
RIP jsperf。我制作了一个 jsbench,至少在我的浏览器(Safari 14)中确认了相同的结果:jsben.ch/SrMoI
2021-05-18 13:23:08
@Andreas 我相信您的测试在 Chrome 中遇到了一个代码路径,它从不进行实际的连接,因为从未读取过字符串。尽管如此,即使强制执行,执行速度仍然相当快:jsperf.com/yet-another-string-concat-test/1
2021-05-19 13:23:08

不,没有对构建字符串的内置支持。您必须改用串联。

当然,您可以创建一个包含字符串不同部分的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()比字符串连接更快的方式。

他的意思是它是如何实现的...如果它的实现方式是在循环中不断附加字符串而不是一次性创建所有字符串,那么使用 join 将毫无意义
2021-04-30 13:23:08
是的,这就是我真正的意思。请原谅我的英语 ;-) 我添加了一个比较结果,即哪种方法在两种浏览器中的运行速度。你可以看到,它是不同的。
2021-05-05 13:23:08
和往常一样,IE6 是个例外:)
2021-05-07 13:23:08
使用 IE6 的人已经习惯了一切都非常缓慢。我不认为他们会责怪你。
2021-05-14 13:23:08
join()是 ECMAScript 的一部分,并且每个 JavaScript 解释器都实现了它。为什么会“依赖”?
2021-05-15 13:23:08

该代码看起来像您要经过一些更改的路线。

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

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}
为什么只接受非 NaN 数字和非空字符串?您的方法不接受null, false, 空字符串, undefined, 或NaN
2021-05-13 13:23:08
@Elijah - 我更喜欢通过不接受有效字符串和数字以外的任何内容来保持 StringBuilder 类的清洁。这只是个人喜好。
2021-05-20 13:23:08

编辑

不,没有内置类。但是,这string literals可能是一个合适的解决方法。

原答案

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

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

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

这并没有回答这个问题。在所有。
2021-04-21 13:23:08
@Peter Mortensen,这个答案只是提供了另一种构建字符串的方法。最初的海报没有说明正在寻求哪种类型的字符串生成器功能。
2021-04-23 13:23:08
@Theophilus OP 确实指定了正在寻求哪种类型的字符串生成器功能:.NET 的 System.Text.StringBuilder 的功能,这是一种以最少的分配连接许多字符串的方法。
2021-04-24 13:23:08
这如何回答问题?
2021-05-03 13:23:08
我也不认为它回答了问题,但有些评论真的没有帮助或欢迎其他成员。在所有。
2021-05-21 13:23:08