日期:2014-05-16  浏览次数:20378 次

【转】如何摆脱JS糟糕的字符串连接
一、ECMAScript的字符串是不可变的,即它们的值不能改变,因此当你写出下面的代码的时候发生了什么呢?
Js代码??
var?str?=?"Hello?";????
str?+=?"world";??
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("");???
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("");????
};??
function?StringBuffer()?{
????this._strs?=?new?Array;
}
StringBuffer.prototype.append?=?function?(str)?{
????this._strs.push(str);
};
StringBuffer.prototype.toString?=?function()?{
????this._strs.join("");
};