JS 字符串连接[性能比较]_javascript技巧

一、ECMAScript的字符串是不可变的,即它们的值不能改变,因此当你写出下面的代码的时候发生了什么呢?
Js代码

复制代码 代码如下:

var str = "Hello ";
str += "world";

执行的步骤如下:
创建存储“Hello“的字符串
创建存储”world“的字符串
创建存储连接结果的字符串
把str的当前内容复制到结果中
把“world”复制到结果中
更新str,使它指向结果
每次完成字符串的连接都会执行步骤2-6,使得这种操作非常消耗资源。想象一下重复这个过程几百次,甚至几千次,那性能如何?
二、那么再看看下面的代码,来解决这种窘况
Js代码

复制代码 代码如下:

var arr = new Array;
arr[0] = "Hello ";
arr[1] = "world";
var str = arr.join("");

执行的步骤如下:
创建存储结果的字符串
把每个字符串复制到结果中的适当位置
这样,无论数组要引入多少字符串都不成问题,因为只有在调用join()方法时候才会发生连接操作。
三、觉得操作很复杂?代码不能确切反应它的意图?那么我们用对象的解决方式吧,使它更容易理解,用StringBuffer类来封装该功能:
Js代码

复制代码 代码如下:

function StringBuffer() {
this._strs = new Array;
}
StringBuffer.prototype.append = function (str) {
this._strs.push(str);
};
StringBuffer.prototype.toString = function() {
this._strs.join("");
};

好了,感受一下吧,现在如何操作字符串呢?
Js代码

复制代码 代码如下:

var sb = new StringBuffer();
sb.append("Hello ");
sb.append("world");
var result = sb.toString();

四、似乎色香味俱全了,但是吃下去的功效如何?
Js代码

复制代码 代码如下:

var tStart = new Date();
var str = "";
for(var i=0;i<10000;i++)
{
str += "text"
}
var tEnd = new Date();
document.write("原始的方法加号 拼接10000个字符串 花费时间:"+(tEnd.getTime()-tStart.getTime())+"秒");
var oSB = new StringBuffer();
tStart = new Date();
for(var i=0;i<10000;i++)
{
oSB.append("text");
}
var sRst = oSB.toString();
tEnd = new Date();
document.write("<br/>StringBuffer 拼接10000个字符串 花费时间:"+(tEnd.getTime()-tStart.getTime())+"秒");

可能你已经猜到了,StringBuffer要比+快,到底快多少呢?我的测试结果:
Js代码
FF3.0.10
原始的方法加号 拼接10000个字符串 花费时间:3豪秒
StringBuffer 拼接10000个字符串 花费时间:8豪秒
IE7
原始的方法加号 拼接10000个字符串 花费时间:15豪秒
StringBuffer 拼接10000个字符串 花费时间:16豪秒
IE8
原始的方法加号 拼接10000个字符串 花费时间:15豪秒
StringBuffer 拼接10000个字符串 花费时间:16豪秒
Chrome1.0.154.46
原始的方法加号 拼接10000个字符串 花费时间:1豪秒
StringBuffer 拼接10000个字符串 花费时间:2豪秒
五、怎么回事?
恩?眼睛花了?还是测试结果贴错了?还是……?
一切都没有错!
2006年11月此书出版《JavaScript高级程序设计》在84-85页,就是我上面的内容,我的测试结果却和它的完全相反,技术的变革还是……?
我觉得是一个教训!深刻的教训!不知道哪看了这篇文章的人会有何感想。

时间: 2025-01-21 09:32:25

JS 字符串连接[性能比较]_javascript技巧的相关文章

JavaScript 字符串连接性能优化_javascript技巧

复制代码 代码如下: var str = "hello"; str += " world"; 后台所做工作: 1)创建存储 "hello" 的字符串,且使 str 指向它. 2)创建存储 "world" 的字符串. 3)创建存储结果的字符串. 4)将 str 中的当前内容复制到结果字符串中. 5)把 world 复制到结果字符串中. 6)更新 str ,使 str 指向结果字符串. 每拼接一次字符串就循环重复2)~6),如果重

数组方法解决JS字符串连接性能问题有争议_javascript技巧

1.传统上,字符串连接一直是js中性能最低的操作之一. var text="Hello"; text+=" World!"; 早期浏览器没有对这种运算进行优化. 由于字符串是不可变的,这意味着要创建中间字符串来存储连接的结果.频繁地在后台创建和销毁字符串导制性能异常低下. 2.发现这一点后,开发者们利用数组对象进行优化. var buffer=[],i=0; buffer[i++]="Hello";//通过相应索引值添加元素比push方法快 bu

js字符串操作方法实例分析_javascript技巧

本文实例讲述了js字符串操作方法.分享给大家供大家参考.具体如下: var str="This is my first Script code."; document.write("原字符串为:"+str+"<br>") document.write("第五个字符之后的部分:"+str.slice(5,-1)+"<br>"); document.write("第五个字符之后

常用js字符串判断方法整理_javascript技巧

js工具-js常用方法,js常用判断方法 SUMMARY : 复制代码 代码如下: function obj$(id) 根据id得到对象 function val$(id) 根据id得到对象的值 function trim(str) 删除左边和右边空格 function ltrim(str) 删除左边空格 function rtrim (str) 删除右边空格 function isEmpty(str) 字串是否有值 function equals(str1, str2) js判断比较两字符串是

JS字符串函数扩展代码_javascript技巧

复制代码 代码如下: /**************************************************** *CreateBy:joe zhou *CreateDate:2011-9-4 *Description:字符串辅助函数 ****************************************************/ //String.prototype = { // caption: function () { // }, // leftPad: fun

javascript下高性能字符串连接StringBuffer类_javascript技巧

复制代码 代码如下: function StringBuffer(){ this.__strings__ = new Array(); } StringBuffer.prototype.append = function(str){ this.__strings__.push(str); }; StringBuffer.prototype.toString = function(){ this.__strings__.join(" "); }; 其实上面的代码,主要利用了js的数组原理

JS字符串截取函数实例_javascript技巧

使用 substring()或者slice() 函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组例子: 复制代码 代码如下: str="jpg|bmp|gif|ico|png";arr=theString.split("|");//arr是一个包含字符值"jpg"."bmp"."gif"."ico"和"png"的数组 函数:John() 功能

JS字符串处理实例代码_javascript技巧

复制代码 代码如下: link(){var olink = getElementById("link");var text = olink.innerHTML;var start = text.indexOf(">")+1;var end = text.lastIndexOf("<");text = text.substring(start,end);location.href=text;}<a href="java:

js字符串连接效率问题

问题描述 js字符串连接效率问题 function StringBuffer() { this.__strings__ = new Array; //这里也可以去掉括号 } StringBuffer.prototype.append = function (str) { this.__strings__.push(str); } StringBuffer.prototype.toString = function () { return this.__strings__.join(""