编辑:这些测试是在2021年9月份使用Google Chrome进行的,并非在NodeJS中运行。
看到这里的一些回复真的很有趣。 如果您不担心旧版浏览器(IE6+)的支持,请跳到插值方法,因为它的性能非常强大。
将字符串按值复制并保持向后兼容性最好的方法之一(向后兼容性可追溯至IE6),而且性能仍然非常高效,是将其拆分为新数组,然后立即将该新数组重新连接为一个字符串:
let str = 'abc';
let copiedStr = str.split('').join('');
console.log('copiedStr', copiedStr);
幕后花絮
以上内容调用JavaScript来使用没有字符的分隔符拆分字符串,这将每个单独字符分割成新创建的数组中的一个元素。 这意味着,对于短暂的时刻,copiedStr
变量看起来像这样:
['a', 'b', 'c']
然后,立即使用不插入任何分隔符的方法将
copiedStr
变量重新连接起来,这意味着在每个元素之间没有分隔符,因此新创建数组中的每个元素都被推回到全新的字符串中,有效地复制了该字符串。
执行结束时,
copiedStr
是它自己的变量,并输出到控制台:
abc
性能
平均情况下,在我的机器上大约需要0.007毫秒-0.01毫秒,但是在您的机器上可能会有所不同。在一个包含4,000个字符的字符串上进行测试,该方法产生了最大约为0.2毫秒,平均约为0.14毫秒的复制字符串时间,因此它的性能仍然很好。
谁在乎遗留支持?/插值方法
但是,如果您不担心旧浏览器的支持问题,这里提供的插值方法
(由 Pirijan 提供)是一种非常高效且易于复制字符串的方法:
let str = 'abc';
let copiedStr = `${str}`;
在同一长度为4,000个字符的字符串上测试插值
的性能时,平均时间为0.004毫秒,最大时间为0.1毫秒,最小时间为惊人的0.001毫秒(非常频繁)。
.substr()
、.substring()
、.slice()
和相关的正则表达式函数都会返回一个新的字符串。调用myClass.myFunc()
的其他代码是否保留了对您巨大字符串的引用?如果您的真实代码更复杂,是否意外地在闭包中保留了这些巨大的字符串? - nnnnnn(' ' + src).slice(1)
。目前还没有官方的解决方案。 - user2864740