javascript中字符串拼接详解
最近在研究《javascript⾼级程序设计》中,有⼀段关于字符串特点的描述,原⽂⼤概如下:ECMAScript中的字符串是不可变的,也就是说,字符串⼀旦创建,他们的值就不能改变。要改变某个变量的保存的的字符串,⾸先要销毁原来的字符串,然后再⽤另外⼀个包含新值的字符串填充该变量,例如:
复制代码代码如下:
var lang = "Java";
lang = lang + "Script";
实现这个操作的过程如下:⾸先创建⼀个能容纳10个字符的新字符串,然后在这个字符串中填充“Java”和“Script”,最后⼀步是销毁原来的字符串“Java”和“Script”,因为这两个字符串已经没⽤了。但是在低版本的浏览器(如IE6)中,字符串拼接速度是很消耗⼀个性能的过程。
由此我就联想到了Java,在Java中的字符串机制也和js差不多(即创建了就不能改变,要改变只能销毁原来的值),但是Java有个StringBuffer解决了字符串不可变的问题,js且没有类似的⽅法。但是我们可以模拟这种缓冲机制。其原理是利⽤数组进⾏拼接,源代码如下:
复制代码代码如下:
function StringBuffer() {
this.__strings__ = new Array();
}
StringBuffer.prototype.append = function (str) {
this.__strings__.push(str);
return this; //⽅便链式操作
}
String = function () {
return this.__strings__.join("");
}
/*测试*/
var buffer = new StringBuffer();
buffer.append("Hello ").append("javascript");
var result = String();
js在字符串中添加字符alert(result);
机制我们模拟出来了,但是这个⽅法和字符串拼接性能上有多少差别了,我们可以测试⼀下,测试代码如下:
复制代码代码如下:
var d1 = new Date();
var str = "";
for(var i = 0; i < 10000; i++){
str += "text ";
}
var d2 = new Date();
document.write("测试⼀花费: " + (d2.getTime() - d1.getTime())/1000 + "秒"+"<br/>");
var oBuffer = new StringBuffer();
d3 = new Date();
for(var i = 0; i < 10000; i++){
oBuffer.append("text ");
}
var sResult = String();
d4 = new Date();
document.write("测试⼆花费: " + (d4.getTime() - d3.getTime())/1000 + "秒");
测试结果如下:(环境不同,测试结果可能不同):
1.在以1000次为基数的情况下,进⾏⽐较,两者执⾏都⾮常快(基本都是⼏毫秒)耗时都差不多,后者以前者相差不会超过10个
毫秒。
2.在以10000次为基数的情况下,执⾏结果和上⾯差不多,但是前者在IE6下话费的事件较多。
3.在以100000次为基数的情况下,字符串拼接在IE6下,明显花的时间更多,其他浏览器相差不⼤,有的反⽽⽐StringBuffer更短。
结论
1.在拼接词数少于1000次的情况下,⼤胆的使⽤前者,⼀般我们也很少碰到拼接次数上千的情况。
2.其他浏览器对于拼接都没什么性能问题,主要是IE6,如果拼接次数上万或者⼗万的话,建议单独对IE6是⽤StringBuffer模拟。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论