手机版

你一定知道JavaScript中字符串连接的一些性能问题

时间:2021-11-20 来源:互联网 编辑:宝哥软件园 浏览:

而JavaScript的核心就是ECMAScript。与其他语言类似,ECMAScript字符串是不可变的,也就是说,它们的值不能更改。请考虑以下代码:复制代码如下:var str=' hellostr=' world其实这段代码的幕后步骤如下:1。创建一个字符串来存储“你好”。2.创建一个字符串来存储“世界”。3.创建一个字符串来存储连接结果。4.将字符串的当前内容复制到结果中。5.将“世界”复制到结果中。6.更新字符串,使其指向结果。每次字符串连接完成时都会执行步骤2到6,这使得该操作非常耗费资源。如果这个过程重复数百次甚至数千次,就会造成性能问题。解决方法是使用Array对象存储字符串,然后使用join()方法(参数为空字符串)创建最终字符串。想象用下面的代码替换前面的代码:复制代码如下: var arr=new Array();arr[0]=' hello ';arr[1]=' world ';var str=arr . join(');这样,无论向数组中引入多少字符串,都不是问题,因为只有在调用join()方法时才会发生join操作。此时,步骤如下:1。创建一个字符串来存储结果;2.将每个字符串复制到结果中的适当位置。这个解决方案虽然好,但是有更好的方法。问题是这个代码并没有完全反映它的意图。为了更容易理解,您可以将此函数与StringBuffer类打包在一起:复制代码如下: function StringBuffer(){ this。_ strings _=new array();} StringBuffer . prototype . append=function(str){ this。_字符串_。push(str);};stringbuffer . prototype . tostring=function(){返回这个。_字符串_。join(' ');};这段代码应该注意的第一件事是strings属性,它应该是私有的。它只有两种方法,即append()和toString()。append()方法有一个参数,它将该参数附加到字符串数组。toString()方法调用数组的join方法,并返回真正连接的字符串。要用StringBuffer对象连接一组字符串,可以使用以下代码:复制代码如下: var buffer=new StringBuffer();buffer . append(' hello ');buffer . append(' world ');var结果=buffer . ToString();基于上面的实现,让我们比较一下运行时间,即使用“”将字符串一个一个地连接起来,并使用我们封装的工具。下面的代码可以用来测试StringBuffer对象和传统字符串连接方法的性能,在chrome控制台中输入代码并运行:复制代码如下: var D1=new Date();var str=for(var I=0;我10000;I){ str=' text ';}var d2=新日期();console . log(' concation with plus : '(d 2 . gettime()-d 1 . gettime())'毫秒');var buffer=new StringBuffer();d1=新日期();for(var I=0;我10000;I){ buffer . append(' text ');} var result=buffer . ToString();d2=新日期();console . log(' concation with stringbuff : '(d 2 . gettime()-d 1 . gettime())'毫秒');这段代码对字符串连接执行两个测试,第一个使用加号,第二个使用StringBuffer类。每个操作由10,000个字符串连接而成。值d1和d2用于判断完成操作所需的时间。请注意,在创建日期对象时,如果没有参数,该对象将获得当前日期和时间。要计算连接操作需要多长时间,请减去日期的毫秒表示形式(getTime()方法的返回值)。这是衡量JavaScript性能的常用方法。这个测试的结果可以帮助您比较使用StringBuffer类和使用加号之间的效率差异。上面例子的结果如下:

那么有些人可能会说,一个concat()方法也封装在JavaScript的String对象中。让我们使用concat()方法来做下面同样的事情。在consoel中输入以下代码:复制代码如下: var D1=new Date();var str=for(var I=0;我10000;I){ str . concat(' text ');}var d2=新日期();console . log(' concation with plus : '(d 2 . gettime()-d 1 . gettime())'毫秒');我们可以看到连接起来需要1万个字符:

可以得出结论,当涉及到一定数量的字符串连接时,我们可以通过在Javascript中封装一个类似于Java的StringBuffer对象(函数)来提高性能。

版权声明:你一定知道JavaScript中字符串连接的一些性能问题是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。