在 JavaScript 中,我有一个包含多次迭代的循环,在每次迭代中,我都会创建一个包含许多+=
运算符的巨大字符串。有没有更有效的方法来创建字符串?我正在考虑创建一个动态数组,在其中不断向其中添加字符串,然后进行连接。任何人都可以解释并举例说明最快的方法吗?
在 JavaScript 中连接字符串的最有效方法?
IT技术
javascript
string
performance
concatenation
2021-01-12 14:29:47
6个回答
我对串联本身没有评论,但我想指出@Jakub Hampl 的建议:
对于在 DOM 中构建字符串,在某些情况下,迭代添加到 DOM 可能更好,而不是一次添加一个巨大的字符串。
是错误的,因为它基于有缺陷的测试。该测试实际上从未附加到 DOM 中。
这个固定的测试表明,在渲染之前一次性创建所有字符串要快得多。这甚至不是比赛。
(对不起,这是一个单独的答案,但我还没有足够的代表来评论答案。)
自从回答这个问题三年过去了,但无论如何我都会提供我的答案:)
实际上,接受的答案并不完全正确。Jakub 的测试使用了硬编码字符串,它允许 JS 引擎优化代码执行(Google 的 V8 在这方面真的很棒!)。但是一旦您使用完全随机的字符串(这里是 JSPerf),那么字符串连接将排在第二位。
我在 node 和 chrome 中都做了一个快速测试,发现在这两种情况下+=
都更快:
var profile = func => {
var start = new Date();
for (var i = 0; i < 10000000; i++) func('test');
console.log(new Date() - start);
}
profile(x => "testtesttesttesttest");
profile(x => `${x}${x}${x}${x}${x}`);
profile(x => x + x + x + x + x );
profile(x => { var s = x; s += x; s += x; s += x; s += x; return s; });
profile(x => [x, x, x, x, x].join(""));
profile(x => { var a = [x]; a.push(x); a.push(x); a.push(x); a.push(x); return a.join(""); });
结果节点:7.0.10
- 作业:8
- 模板文字:524
- 加:382
- 加等于:379
- 数组连接:1476
- 数组推送连接:1651
chrome 86.0.4240.198 的结果:
- 作业:6
- 模板文字:531
- 加:406
- 加等于:403
- 数组连接:1552
- 数组推送连接:1813