Fab*_*obs 293

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

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

var html = [];
html.push(
  "<html>",
  "<body>",
  "bla bla bla",
  "</body>",
  "</html>"
);
return html.join("");
Run Code Online (Sandbox Code Playgroud)

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

  • 我不知道`push`可以接受多个参数.你学到的随机事物. (9认同)
  • 如果你在内联生成输出,或者所有成员都是文字,`[foo(),"bar","baz"].join("");`也可以. (7认同)
  • 注意,这里的IE是指IE 7及更早版本。在 IE 8+ 中,串联并不比其他浏览器差。 (2认同)

And*_*eas 46

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

在当前的浏览器(FF,Opera,IE11,Chrome)中,"concat"比"join"快4到10倍.

在IE8中,两者都返回相同的结果.

在IE7中,遗憾的是,"加入"速度快了大约100倍.

  • 谢谢你。这应该在答案列表中增加。它在 IE10 上的速度也快得多(我知道这不是现代浏览器,但我向任何潜在的 NMCI 开发人员提到了这一点)。 (3认同)
  • 安息吧 jsperf。我做了一个 jsbench,至少在我的浏览器(Safari 14)中确认了相同的结果:https://jsben.ch/SrMoI (3认同)
  • http://jsperf.com 链接的症状是“此部署已被禁用。... 429:TOO_MANY_REQUESTS”。 (2认同)

nai*_*sts 32

不,没有内置的支持来构建字符串.你必须使用连接.

当然,您可以创建字符串的不同部分的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));
Run Code Online (Sandbox Code Playgroud)

我在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方法更快.

UPDATE

我在Internet Explorer 6(Windows XP)上执行了测试.如果我在超过100,000次迭代中尝试测试,则该过程停止立即响应并且永远不会结束.在40,000次迭代中,结果是

Time (strings): 59175 ms
Time (arrays): 220 ms
Run Code Online (Sandbox Code Playgroud)

这意味着 - 如果您需要支持Internet Explorer 6,请选择array.join()哪种方式比字符串连接更快.

  • 使用IE6的人习惯于让一切都变得非常缓慢.我不认为他们会责备你. (8认同)
  • IE6,一如既往,是例外:) (2认同)

The*_*lus 8

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

var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
Run Code Online (Sandbox Code Playgroud)

请注意,反向标记(而不是单引号)包含该字符串.

  • 这是如何回答这个问题的? (8认同)
  • 这并不能回答问题。完全没有。 (3认同)
  • 我也不认为它回答了问题,但有些评论确实对其他成员没有帮助或欢迎。完全没有。 (2认同)

Gor*_*ker 7

该代码看起来像您想要进行一些更改的路线.

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

StringBuilder.prototype.append = function (value) {
    if (value || value === 0) {
        this.strings.push(value);
    }
    return this;
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么只接受非 NaN 数字和非空字符串?您的方法不接受“null”、“false”、空字符串、“undefined”或“NaN”。 (2认同)
  • @Elijah - 我更喜欢通过不接受除有效字符串和数字之外的任何内容来保持 StringBuilder 类的干净。这只是个人喜好。 (2认同)

小智 5

JavaScript 的 StringBuilder 试试这个..

  
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();
Run Code Online (Sandbox Code Playgroud)