Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript是否有内置的stringbuilder类?_Javascript_Stringbuilder - Fatal编程技术网

JavaScript是否有内置的stringbuilder类?

JavaScript是否有内置的stringbuilder类?,javascript,stringbuilder,Javascript,Stringbuilder,我明白了 但是JavaScript中有常规的实现吗?没有,没有内置的对构建字符串的支持。您必须使用串联 当然,您可以创建字符串不同部分的数组,然后对该数组调用join(),但这取决于您使用的JavaScript解释器中如何实现连接 我做了一个实验来比较str1+str2方法与array.push(str1,str2).join()方法的速度。代码很简单: var iIterations =800000; var d1 = (new Date()).valueOf(); str1 = "

我明白了


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

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

当然,您可以创建字符串不同部分的数组,然后对该数组调用
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));

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

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

当我必须进行大量字符串连接时,我通常填充数组,而不使用字符串生成器类:

var html = [];
html.push(
  "<html>",
  "<body>",
  "bla bla bla",
  "</body>",
  "</html>"
);
return html.join("");
var html=[];
html.push(
"",
"",
“呜呜呜呜”,
"",
""
);
返回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.join,但优于+串联。由于String.concat要求将每个段指定为单独的参数,因此调用方受到执行JavaScript引擎施加的任何参数计数限制的限制。查看以了解更多信息。

我刚刚重新检查了上的性能。 测试用例连接或加入字母表1000次

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

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


不幸的是,在IE7中,“join”的速度快了大约100倍。

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

试试下面的文章怎么样

在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);
引入了JavaScript的ECMAScript 6版本(又称ECMAScript 2015)


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

我定义了以下函数:

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;
    }
结果:

你好,约翰,你今年29岁



join()。为什么要“依赖”?他指的是它是如何实现的。。。如果它是以一种方式实现的,在一个循环中,字符串是不断追加的,而不是一次创建的,那么使用join将是无点的,这就是我真正的意思。请原谅我的英语;-)我添加了比较哪种方法在两种浏览器中工作的速度的结果。你可以看到,这是不同的。IE6,一如既往,是个例外:)有IE6的人习惯于一切都很慢。我不认为他们会责怪你。为什么只接受非NaN数字和非空字符串?您的方法不会接受
null
false
、空字符串、
未定义的
、或
NaN
@Elijah-我更愿意通过只接受有效字符串和数字来保持我的StringBuilder类的干净。这只是个人偏好。如果您正在内联生成输出,或者所有成员都是文本,
[foo(),“bar”,“baz”].join(“”)也能工作。虽然人们可能无法期望dropbox链接能工作近3年,但我很好奇这种比较——如果它仍然有效的话。@DaveWard,你的链接断了:(我发现这比string+string+string更具可读性,我不知道
push
可以接受多个参数。您学习的随机内容。Read。这在Chrome中失败,因为“string.concat”未定义。相反,您可以使用“”。concat.apply(“”,arrayOfStrings)。但这仍然是一个非常慢的方法。谢谢。这应该在答案列表中增加。在IE10上也要快得多(我知道这不是一个现代浏览器,但我向任何看到这一点的潜在NMCI开发人员提及)@Andreas我相信你的测试在Chrome中遇到了一个代码路径,因为它从未执行实际的连接,因为字符串从未被读取。尽管如此,即使强制执行,执行速度仍然要快得多:RIP jsperf。我制作了一个jsbench,至少在我的浏览器(Safari 14)中确认了相同的结果:这是如何回答这个问题的?@Peter Mortensen,这个答案只是给出了另一种构建字符串的方法。原始海报没有说明正在寻求哪种类型的字符串生成器功能。这根本没有回答这个问题。我也不认为它回答了这个问题,但一些评论确实没有帮助或不欢迎其他人呃,各位成员。我喜欢这样。这个答案似乎与这个问题无关。我非常怀疑运行正则表达式来代替字符串连接会更有效。此外,这是一个糟糕的实现。如果替换
{0}
的字符串包含
{1},它将崩溃
@ikegami字符串不是变量,而是常量,因此您知道其中包含的内容是先验的。@在代码中复制和粘贴所有这些内容是一个更糟糕的想法。这并不能回答问题。StringBuilder类不适用于字符串插值。
var classType = "stringbuilder";
var q = `Does JavaScript have a built-in ${classType} class?`;
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;
    }
 var text = format("hello {0}, your age is {1}.",  "John",  29);