JavaScript有内置的stringbuilder类吗?

时间:2010-01-18 16:29:49

标签: javascript stringbuilder

我看到a few code project solutions

但JavaScript中是否有常规实现?

10 个答案:

答案 0 :(得分:273)

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

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

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

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

答案 1 :(得分:41)

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

在当前的浏览器中(FF,Opera,IE11,Chrome),&#34; concat&#34;比#34;加入&#34;快约4-10倍。

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

在IE7中,&#34;加入&#34;不幸的是,快了大约100倍。

答案 2 :(得分:31)

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

当然,您可以创建字符串的不同部分的数组,然后在该数组上调用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毫秒,在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次迭代中尝试测试,则该过程停止立即响应并且永远不会结束。 在40,000次迭代中,结果是

Time (strings): 59175 ms
Time (arrays): 220 ms

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

答案 3 :(得分:6)

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

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

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

答案 4 :(得分:6)

JavaScript的ECMAScript 6版本(又名ECMAScript 2015)引入了string literals

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

请注意,反序号而不是单引号括起来。

答案 5 :(得分:3)

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

答案 6 :(得分:1)

对于那些感兴趣的人,这里可以选择调用Array.join:

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

正如预期的那样,输出是字符串&foffar&#39;。在Firefox中,这种方法优于Array.join,但优于+连接。由于String.concat要求将每个段指定为单独的参数,因此调用方受限于执行JavaScript引擎强加的任何参数计数限制。有关详细信息,请查看the documentation of Function.prototype.apply()

答案 7 :(得分:1)

我已定义此功能:

function format() {
        var args = arguments;
        if (args.length <= 1) { 
            return args;
        }
        var result = args[0];
        for (var i = 1; i < args.length; i++) {
            result = result.replace(new RegExp("\\{" + (i - 1) + "\\}", "g"), args[i]);
        }
        return result;
    }

可以像c#一样调用:

 var text = format("hello {0}, your age is {1}.",  "John",  29);

结果:

  约翰,你好,你的年龄是29岁。

答案 8 :(得分:0)

当我发现自己在JavaScript中进行大量字符串连接时,我开始寻找模板。 Handlebars.js可以很好地保持HTML和JavaScript的可读性。 http://handlebarsjs.com

答案 9 :(得分:0)

sys.StringBuilder()如何尝试以下文章。

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